“要求”在“使用”起作用的地方不起作用

Posted

技术标签:

【中文标题】“要求”在“使用”起作用的地方不起作用【英文标题】:"require" doesn't work where "use" works 【发布时间】:2012-04-07 08:19:09 【问题描述】:

My_Module-模块(在此包中使用)uses 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);

您正在将该散列的 内容 传递给导入例程。由于 NUM63TRAP 是信号名称,它们不是 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,但这与您当前遇到的错误无关。)

【讨论】:

以上是关于“要求”在“使用”起作用的地方不起作用的主要内容,如果未能解决你的问题,请参考以下文章

谷歌地方自动完成的样式不起作用

“导入”和“要求”都不起作用

要求属性在移动设备上不起作用

php pdo 请求对给定值不起作用的地方?

rvm 要求不起作用

Entity Framework Core Linq NULL 不起作用的地方