perl - perl 模块中的本地哈希初始化导致空哈希

标签 perl module initialization local-variables

当我在 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/

相关文章:

javascript - 在 drupal 中单击没有灯箱的画廊(多个 cck 图像)

c# - 是否应该将此列表初始值设定项行为报告为 Visual Studio C# 编译器中的错误?

perl - '$::n' 对 perl 意味着什么?

perl - 任何人都可以向我解释这个只读异常吗?

Perl 模块 - 跨主机迁移/部署

python - 基于类的 "Task"模块的好模式吗?

java - 为什么静态字段初始化失败导致NoClassDefFoundError?

C - 以某种密度填充矩阵

perl - 在 Perl/Moose 中,我可以有两个相互依赖的默认属性吗?

Perl 高尔夫 : Print the powers of a number