Perl:数组引用与匿名数组

时间:2012-05-01 04:21:22

标签: arrays perl

这可能是一个愚蠢的问题......以下代码分别输出@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   

3 个答案:

答案 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