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)
。可以帮助简化这一点。