Когда я инициализирую локальный хэш (используя «мой») в модуле perl, хэш кажется пустым из функций модуля.
Вот код Perl-модуля:
package Test;
use 5.014002;
use strict;
use warnings;
use Exporter qw(import);
our %EXPORT_TAGS = (
'all' => [ qw(test) ]
);
our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
our @EXPORT = qw(
);
our $VERSION = '0.01';
my %h = ( "1" => "one" );
BEGIN
{
}
sub test
{
my $a = shift;
print $Test::h{$a} . "\n";
}
1;
__END__
Здесь test видит пустой хэш.
Если вместо этого я сначала объявлю хэш, но инициализирую его в BEGIN, тогда все будет работать нормально. Вот измененный код:
package Test;
use 5.014002;
use strict;
use warnings;
use Exporter qw('import');
our %EXPORT_TAGS = (
'all' => [ qw(test) ]
);
our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
our @EXPORT = qw(
);
our $VERSION = '0.01';
my %h;
BEGIN
{
%Test::h = ( "1" => "one" );
}
sub test
{
my $a = shift;
print $Test::h{$a} . "\n";
}
1;
__END__
Кроме того, если я объявлю хеш, используя вместо этого «наш», то он отлично работает в обоих случаях.
Что мне не хватает?
Test::h
иmy %h
совершенно разные переменные. Вы должны получить предупреждение, похожее на этоName "Test::h" used only once: possible typo at test.pl line 25.
с вашим первым примером. Разве ты этого не видишь? Примечание: это прекрасно работает сour
, потому чтоour %h = ....
является псевдонимом для%Test::h = ...
. - person Hunter McMillen   schedule 07.01.2015