当我在 perl 模块中初始化本地散列(使用“my”)时,模块函数中的散列似乎为空。
下面是 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__
在这里,测试看到一个空的哈希。
相反,如果我先声明哈希,但在 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__
此外,如果我改为使用“我们的”声明哈希,那么它在两种情况下都可以正常工作。
我错过了什么?
最佳答案
our
为动态范围的包变量创建一个词法别名,该变量可以由 $Fully::Qualified::name 引用。
my
生成一个词法范围的变量,这种变量只能由 $name 引用。
来自@Schwern的注释,“词法”是指仅限于封闭 block 和任何后续嵌套 block ,但在其他 block 内不可见(例如,从声明 my $lexical_var
的 block 内调用的其他地方定义的子例程看不到该变量) .
因此,在您的代码中,my %h
是一个在词法范围内限定于其封闭文件 (Test.pm?) 的隐式 block 的变量。 our %h
另一方面,它是完全不同的变量的词法别名,特别是完全限定名称为 %Test::h
的包(全局)变量。 .在这两个示例中,您的 sub test
通过完全限定名称查询包变量。但只有在第二个示例中,您才为该变量分配任何值。
(您没有具体询问,但 local
将给定的包变量动态限定为封闭文件、 block 或 eval。您在帖子中多次使用形容词“本地”,但与实际情况不一致这意味着作为 perl 关键字。)
关于perl - perl 模块中的本地哈希初始化导致空哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27807557/