在Perl中,为什么可以';一个包含对文本的引用的变量?
几天来,我一直在努力学习Perl,但仍然经常对Perl的工作方式和原因感到惊讶,有时甚至感到困惑。下面是我最新的困惑:为什么下面两段代码不相等在Perl中,为什么可以';一个包含对文本的引用的变量?,perl,reference,Perl,Reference,几天来,我一直在努力学习Perl,但仍然经常对Perl的工作方式和原因感到惊讶,有时甚至感到困惑。下面是我最新的困惑:为什么下面两段代码不相等 my $thing = ''; bless \$thing; # class is implicit 对 my $thing = \''; bless $thing; # class again implicit 第二种形式在第二行显示“试图修改只读值”。\'是对文本的引用 \$thing是对$thing的引用。此时,$thing的值设置为空字符串
my $thing = '';
bless \$thing; # class is implicit
对
my $thing = \'';
bless $thing; # class again implicit
第二种形式在第二行显示“试图修改只读值”。\'
是对文本的引用
\$thing
是对$thing
的引用。此时,$thing
的值设置为空字符串
您收到错误的原因与以下错误的原因相同:
my $thing = \5;
$$thing = 10;
bless
修改其第一个参数所指的对象。在本例中,以及在您的示例中,$x
指的是不可修改的内容
见:
物体是有福的;变量不是
当我们祝福某事物时,我们既不祝福包含该事物引用的变量,也不祝福该变量存储的引用;我们祝福变量所指的事物(有时称为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 barry world”
中那样通过后门修改实例数据bless
操作符通过引用工作:被引用的对象被祝福。通常引用的数据是散列,但正如您所发现的,它也可能是标量或任何其他Perl数据类型
my $thing = '';
bless \$thing; # class is implicit
这很好。您正在将$thing
设置为空字符串(此处不相关),并通过将对它的引用传递给bless
my $thing = \'';
bless $thing; # class again implicit
这将$thing
设置为对字符串常量的引用,因此bless
将尝试处理该常量,这是不可能的,因为正如消息所述,它是只读的
简而言之,在第一种情况下,你是在祝福标量变量
$thing
,而在第二种情况下,你是在祝福字符串常量'
,它失败了,这在我的问题中是一个输入错误。我的原始代码没有一个多余的撇号。现在解决问题。接得好,谢谢!好吧,事情开始变得有意义了,尽管从Python心态和C++思维方式来看,这有点奇怪。让我看看我是否做对了。文字总是不可变的,因此对文字的引用就是对常量的引用,因此不能更改,因为更改数字5没有意义。为变量分配一个文本告诉Perl为该文本分配一个居住的地方。现在,引用这个变量可以得到一个非常好的可变对象。是这样吗?好的,谢谢!我真的很想有图表,但我不知道如何解释我想要什么样的图表,而且这个界面无论如何都不利于绘制它们。你已经回答了我最初的问题,还有几个问题。再次感谢<代码>[]复制您放入其中的所有内容。正如$x=1$y=[$x]$y[0]=2
未将$x
设置为2,$y=[5]$y[0]=6
未将常数5设置为6;相反,当数组被创建时,它有一个新的标量元素,其值被设置为5,并且新的标量是被修改的。@Mark VY,[]
创建一个新数组[5]
大致相当于do{my@anon=5;\@anon}。这意味着标量等价于@{[5]}=10代码>是${do{my$anon=5;\$anon}}=10代码>,而不是${\5}=10代码>。相反地,${\5}的数组等价物=10代码>将是使用只读;只读::数组my@a=>5@{\@a}=10代码>。