这可能是一个愚蠢的问题......以下代码分别输出@arrayref
和@arraycont
的内容。请注意它们之间的差异以及它们的值的分配方式。我知道匿名数组的作用,但有人可以解释为什么会有区别吗?
非常感谢。
@arrayref = ();
@array = qw(1 2 3 4);
$arrayref[0] = \@array;
@array = qw(5 6 7 8);
$arrayref[1] = \@array;
print join "\t", @{$arrayref[0]}, "\n";
print join "\t", @{$arrayref[1]}, "\n";
@arraycont = ();
@array = qw(1 2 3 4);
$arraycont[0] = [@array];
@array = qw(5 6 7 8);
$arraycont[1] = [@array];
print join "\t", @{$arraycont[0]}, "\n";
print join "\t", @{$arraycont[1]}, "\n";
输出
5 6 7 8
5 6 7 8
1 2 3 4
5 6 7 8
答案 0 :(得分:11)
这将创建数组的浅副本:
$arraycont[0] = [@array];
虽然这只是创建了对它的引用:
$arrayref[0] = \@array;
由于您稍后修改了数组:
@array = qw(5 6 7 8);
arrayref
仍然指向内存中的相同数组位置,因此当在print语句中取消引用时,它会打印当前数组值5 6 7 8
。
答案 1 :(得分:3)
第一个块存储 @array 的地址。引用就像'直播',您获得当前状态。 因此,如果您在取消引用时创建对 @array的引用,例如\ @array,,那么在取消引用时,您将始终获得 @array 点的内容。 当你取消推荐 @array 有(5 6 7 8)
当您执行 [@ array] 时,就像将直播录制到您的磁盘中一样。所以当你(重新)播放录制的内容时,你会得到的是什么 在录制时流式传输。因此,当您参考 $ arraycont [0] 时,您会获得 @array 在复制时所拥有的内容 (1 2 3 4)
答案 2 :(得分:0)
您对$arrayref[0]
和$arrayref[1]
中的单个数组进行了存储引用。您
应该使用不同的数组。
my @refs;
my @array1 = qw(1 2 3 4);
push @refs, \@array1;
my @array2 = qw(5 6 7 8);
push @refs, \@array2;
实际上,my
在循环的每次传递中执行,每次都创建一个新数组。
my @refs;
while ( my @row = get() ) {
push @refs, \@row;
}
在极少数情况下,您必须克隆阵列,您可以使用:
use Storable qw( dclone );
push @refs, [ @row ]; # Shallow clone
push @refs, dclone(\@row); # Deep clone