当我在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__
此外,如果我使用"我们的"声明哈希。相反,它在两种情况下都能正常工作。
我错过了什么?
答案 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)
我用包裹做的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;