Perl “bless”在支撑结构中起什么作用?

Perl “bless”在支撑结构中起什么作用?,perl,Perl,引用自HTML/Template.pm,为什么不简单地祝福$self,$pkg,因为$self是未定义的-几乎等同于: my $self; { my %hash; $self = bless(\%hash, $pkg); } 或: 编辑回答评论: 你不能祝福一个未定义的值,因为你会得到错误,不能祝福…处的非参考值。这是因为只有硬引用才能被祝福。这就是Perl强制对象封装的方式。请参阅。我认为其目的是将%hash的范围限制在封闭块内。这可以改写为: $self = bless( {}, $pkg

引用自
HTML/Template.pm
,为什么不简单地
祝福$self,$pkg

,因为
$self
未定义的
-几乎等同于:

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

编辑回答评论:


你不能祝福一个未定义的值,因为你会得到错误,
不能祝福…
处的非参考值。这是因为只有硬引用才能被祝福。这就是Perl强制对象封装的方式。请参阅。

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

$self = bless( {}, $pkg);
在以下声明中:

 $hash  =   {};
 ^^^^^      ^^
referrer referent
$hash
引用的引用对象(匿名哈希)标记为
$pkg
(HTML::Template类)的对象。它不会改变
$hash
变量

bless
函数返回对受祝福匿名哈希的引用
$self
因此成为对受祝福的匿名散列(referent)的引用

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

$self = bless( $hash, $pkg );
$self
没有引用任何东西-它是
undef
。没有可祝福的参照物。这相当于尝试这样做:

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

提供了一个很好的主题介绍。

你的意思是
undef
vars不能被祝福吗?我的意思是
undef
与hash ref不同:)为什么我不能先祝福它,然后再初始化它?@Learning,因为得到祝福的是引用,而不是变量。你不能祝福
undef
,因为它不是一个参考。@cjm,那
bless\$self,$pkg
$self = bless( $hash, $pkg );
$self = bless( $self, $pkg );
$self = bless( undef, $pkg );