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

时间:2015-01-06 21:34:32

标签: 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__

这里,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__

此外,如果我使用"我们的"声明哈希。相反,它在两种情况下都能正常工作。

我错过了什么?

2 个答案:

答案 0 :(得分:4)

our动态范围的包变量创建一个词汇别名,该类型可由$ Fully :: Qualified :: name引用。

my创建一个词法范围的变量,这种变量只能通过$ name引用。

借鉴@Schwern的评论,以及#34; lexical"我们的意思是限于封闭块和任何后续的嵌套块,但在其他块内可见(例如,在声明my $lexical_var的块内调用的其他定义的子例程无法看到该变量)。

因此,在您的代码中,my %h是一个词法范围为其封闭文件(Test.pm?)的隐式块的变量。另一方面,our %h是一个完全不同的变量的词法别名,特别是一个完全限定名为%Test::h的包(全局)变量。在这两个示例中,sub test通过其完全限定名称查询包变量。但只有在第二个示例中,您才为该变量分配任何值。

(你没有具体询问它,但是local动态地将给定的包变量限定为封闭的文件,块或eval。你使用形容词" local" a您的帖子中几次与perl关键字的含义不一致。)

答案 1 :(得分:-4)

哎哟 - 你想做什么? 有没有理由这个'使用5.014002;'? 我的意思是,如果你尝试一些旧学校的东西很酷 - 我在这个网站上因为做旧学校的perl而受到批评。但是,如果你正在学习,也许你想做新的东西?

我用包裹做的OO perl如下。 反正。

package myModule;

sub new
{
   $class = shift;
   my $self = {};
   bless $self, $class;

   return $self;
}

sub someMethod
{
   my $self = shift;
   $self->{some} = "value";

   return $self;
}

1;