my $self; { my %hash; $self = bless(\%hash, $pkg); }
引自HTML/Template.pm
,为什么不简单bless $self,$pkg
?
答案 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)
因为$self
是undef
- 几乎相同的是:
my $self ={}; { $self = bless($self, $pkg); }
或者:
$self = bless( {}, $pkg);
编辑以回复评论:
你无法保佑undef,因为你会得到错误Can't bless non-reference value at ...
。这是因为只有硬参考才能得到祝福。这就是Perl 强制执行对象封装的方式。请参阅perlobj manpage。