Perl引用的奇怪行为

时间:2011-08-06 12:23:57

标签: 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语言,其中不会发生这样的事情 - 无论其引用如何,我都可以修改一个对象。

所以有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

my @s = @$ref;

生成引用数组的副本。之后,@s@arr是不相关的数组,恰好具有相同的内容(暂时)。

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

push @$ref, 4;

还有Data::Alias模块,(我认为)可以让你做你想要的。但那里有很深的魔法,我自己从未使用过它。