我一直在努力学习Perl几天,我仍然经常感到惊讶,有时会对它如何以及为什么做事情感到困惑。这是我最新的难题:为什么以下两个代码块不相同?
my $thing = '';
bless \$thing; # class is implicit
与
my $thing = \'';
bless $thing; # class again implicit
第二行表示“在第二行上修改了一个只读值”。
答案 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
,而在第二种情况下,你试图保佑失败的字符串常量''