在Perl中,为什么我不能祝福包含对文字的引用的变量?

时间:2017-07-20 14:43:07

标签: perl reference

我一直在努力学习Perl几天,我仍然经常感到惊讶,有时会对它如何以及为什么做事情感到困惑。这是我最新的难题:为什么以下两个代码块不相同?

my $thing = '';
bless \$thing; # class is implicit

my $thing = \'';
bless $thing; # class again implicit

第二行表示“在第二行上修改了一个只读值”。

2 个答案:

答案 0 :(得分:5)

\''是对文字的引用。

\$thing是对$thing的引用。此时$thing的值设置为空字符串。

您获得错误的原因与以下错误原因相同:

my $thing = \5;
$$thing = 10;

bless修改其第一个参数所引用的内容。在这种情况下,在您的情况下,$x指的是不可修改的内容。

请参阅perldoc perlobj

  

物品是有福的;变量不是

     

当我们bless某事时,我们不会祝福包含对该事物的引用的变量,也不会祝福变量存储的引用;我们祝福 变量引用的东西 (有时称为 referent )。 (强调我的

如果你想要一个由标量支持的类,你可以这样做:

#!/usr/bin/env perl

use v5.10;

package MyString;

use strict; use warnings;

sub new {
    my ($class, $self) = @_;
    bless \$self => $class;
}

sub content { ${$_[0] }
sub length { length ${$_[0]} }

package main;

use strict; use warnings;

my $string => MyString->new("Hello World");

say $string->$_ for qw(content length);

当然,您需要遵守纪律,而不是像$$string = "Bye bye cruel world"中那样通过后门修改实例数据。

答案 1 :(得分:4)

bless运算符通过引用:它是被引用的对象变得有福了。通常,引用的数据是哈希值,但是您发现它也可能是标量或任何其他Perl数据类型

my $thing = '';
bless \$thing; # class is implicit

这很好。您正在将$thing设置为空字符串(这里与此无关),并通过将引用传递给bless

来祝福它
my $thing = \'';
bless $thing; # class again implicit

这会将$thing设置为引用为字符串常量,因此bless会尝试处理该常量,这是不可能的,因为正如消息所示,它是只读的

简而言之,在第一种情况下,你祝福标量变量$thing,而在第二种情况下,你试图保佑失败的字符串常量''