你怎么理解这里的诀窍?

时间:2011-07-12 06:57:37

标签: perl

my $self; { my %hash; $self = bless(\%hash, $pkg); }

引自HTML/Template.pm,为什么不简单bless $self,$pkg

3 个答案:

答案 0 :(得分:4)

我认为目的是将%hash的范围限制在封闭区块内。这可以改写为:

my $self = bless {}, $pkg;

答案 1 :(得分:1)

 $hash  =   {};
 ^^^^^      ^^
referrer referent

在以下声明中:

$self = bless( $hash, $pkg );

bless标记$hash引用的引用(匿名哈希),作为$pkg的对象(HTML :: Template类)。它不会改变$hash变量。

bless函数返回对受祝福的匿名哈希的引用。因此$self成为对受祝福的匿名哈希(指示物)的引用。

重要的是要记住,如果bless函数的第一个参数是引用,那么它引用的是受祝福的东西,而不是变量本身:

$self = bless( $self, $pkg );

$self没有引用任何内容 - 它是undef。祝福没有指称。这相当于尝试这个:

$self = bless( undef, $pkg );

Bless My Referents为该主题提供了很好的介绍。

答案 2 :(得分:0)

因为$selfundef - 几乎相同的是:

my $self ={}; { $self = bless($self, $pkg); }

或者:

$self = bless( {}, $pkg);

编辑以回复评论:

你无法保佑undef,因为你会得到错误Can't bless non-reference value at ...。这是因为只有硬参考才能得到祝福。这就是Perl 强制执行对象封装的方式。请参阅perlobj manpage