2012-03-22 27 views
1

My_Module - 模塊(在此包中使用)use小號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

回答

4

因爲當你這樣做:

Signals::XSIG->import(%Signals::XSIG::XSIG); 

你傳遞的內容的散列到導入例程。由於NUM63TRAP是信號名稱,並且它們對於Signals :: XSIG無效導出,所以您會收到這些錯誤。

你需要這樣做:

Signals::XSIG->import('%XSIG'); 

,因爲它承認Exporter識別字符串'%XSIG'作爲它確實出口的事情之一。

3
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的,但這是無關目前你所得到的錯誤)