“要求”在“使用”起作用的地方不起作用
Posted
技术标签:
【中文标题】“要求”在“使用”起作用的地方不起作用【英文标题】:"require" doesn't work where "use" works 【发布时间】:2012-04-07 08:19:09 【问题描述】:My_Module
-模块(在此包中使用)use
s Signals::XSIG 并设置 $XSIG'WINCH'[1] = sub ... ;
use warnings;
use 5.014;
package Auto_sid;
use Exporter 'import';
our @EXPORT = qw(something);
use My_Module;
no warnings qw(redefine);
sub My_Module::list_to_big
my ( @arguments ) = @_;
require Signals::XSIG;
Signals::XSIG->import(%Signals::XSIG::XSIG);
@$Signals::XSIG::XSIG'WINCH' = ();
no Signals::XSIG;
# ...
# do something that My_Module normaly doesn't do and
# which doesn't work when modified $SIG'WINCH'
# ...
当我使用它时,我会收到很多错误消息,例如:
"NUM63" is not exported by the Signals::XSIG module
"ARRAY(0xc23180)" is not exported by the Signals::XSIG module
"TRAP" is not exported by the Signals::XSIG module
"ARRAY(0xc119c8)" is not exported by the Signals::XSIG module
...
当我使用 use
而不是 require
时,它工作正常。
为什么这不适用于require
?
【问题讨论】:
【参考方案1】:因为当你这样做时:
Signals::XSIG->import(%Signals::XSIG::XSIG);
您正在将该散列的 内容 传递给导入例程。由于 NUM63
和 TRAP
是信号名称,它们不是 Signals::XSIG 的有效导出,因此您会遇到这些错误。
你需要这样做:
Signals::XSIG->import('%XSIG');
因为它识别Exporter
将字符串'%XSIG'
识别为它执行导出的事情之一。
【讨论】:
【参考方案2】:use Signals::XSIG qw( %XSIG );
等价于
BEGIN
require Signals::XSIG;
Signals::XSIG->import(qw( %XSIG ));
而不是
# Passes the string '%XSIG'
Signals::XSIG->import(qw( %XSIG ));
你会的
# Passes the contents of %Signals::XSIG::XSIG
Signals::XSIG->import(%Signals::XSIG::XSIG);
import
抱怨您传递给它的所有错误值。
(您还删除了BEGIN
,但这与您当前遇到的错误无关。)
【讨论】:
以上是关于“要求”在“使用”起作用的地方不起作用的主要内容,如果未能解决你的问题,请参考以下文章