Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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_Oop - Fatal编程技术网

Perl引用的奇怪行为

Perl引用的奇怪行为,perl,oop,Perl,Oop,看看这段代码: my @arr = (1, 2); my $ref = \@arr; my @s = @$ref; push @s, 4; print join(", ", @arr) . "\n"; 出乎意料的是,输出是“1,2”。怎么搞的?为什么我得到了两个不同的数组(@s是(1,2,4)) 当然,如果我在输出之前写下类似这样的东西,我会得到“1,2,4”: $ref = \@s; @arr = @$ref; 但这似乎相当笨拙 我已经习惯了其他OOP语言,在这些语言中,这样的事情是不会发

看看这段代码:

my @arr = (1, 2);
my $ref = \@arr;
my @s = @$ref;
push @s, 4;
print join(", ", @arr) . "\n";
出乎意料的是,输出是“1,2”。怎么搞的?为什么我得到了两个不同的数组(@s是(1,2,4))

当然,如果我在输出之前写下类似这样的东西,我会得到“1,2,4”:

$ref = \@s;
@arr = @$ref;
但这似乎相当笨拙

我已经习惯了其他OOP语言,在这些语言中,这样的事情是不会发生的——一个对象可以被修改,不管它的引用是什么

有人能帮我吗

my @s = @$ref;
创建引用数组的副本。在此之后,
@s
@arr
是不相关的数组,只是碰巧有相同的内容(暂时)

如果要修改引用的数组,必须直接使用它,例如:

push @$ref, 4;

还有一个模块,我想它可以让你做你想做的事情。但其中蕴含着深刻的魔力,我自己也从未使用过。

谢谢你的回答。这很奇怪,不是吗?有没有办法“修复”它?我的意图如下:我有一个类,它的一个字段是对数组的引用。我希望在另一个类中更改该数组,所以我做了@array=@{$object->{array};但那没用。所以你是说最好的方法是写我的$ref=$object->{array}并每次推送@ref$ref?@Rob,这是一种方法。在Perl 5.14中,您可以编写
push$ref,4
(隐式解引用)。您还可以编写一个
push_数组
方法,然后执行
$object->push_数组(4)
。可以帮助简化这一点。