«требовать» не работает там, где «использовать» работает - PullRequest
1 голос
/ 22 марта 2012

Модуль My_Module (используется в этом пакете) use s Сигналы :: 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?

Ответы [ 2 ]

4 голосов
/ 22 марта 2012

Потому что, когда вы делаете это:

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

вы передаете содержимое этого хэша в процедуру импорта. Так как NUM63 и TRAP являются именами сигналов, и они не являются допустимыми экспортами для Signals :: XSIG, вы получаете эти ошибки.

Вам нужно сделать это:

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

Поскольку он распознает Exporter, он распознает строку '%XSIG' как одну из вещей, которую делает экспорт.

3 голосов
/ 22 марта 2012
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, но это не связано с ошибками, которые вы получаете в настоящее время.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...