Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中,为什么可以';一个包含对文本的引用的变量?_Perl_Reference - Fatal编程技术网

在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的值设置为空字符串

几天来,我一直在努力学习Perl,但仍然经常对Perl的工作方式和原因感到惊讶,有时甚至感到困惑。下面是我最新的困惑:为什么下面两段代码不相等

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