8

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

3 回答 3

11

这将创建数组的浅表副本:

$arraycont[0] = [@array];

而这只是创建对它的引用:

$arrayref[0] = \@array;

由于您稍后修改了数组:

@array = qw(5 6 7 8);

arrayref仍然指向内存中相同的数组位置,因此当在打印语句中取消引用时,它会打印当前数组值5 6 7 8

于 2012-05-01T04:27:25.127 回答
3

第一个块存储@array的地址。参考就像“直播”,你会得到当前的状态。因此,如果您创建对@array 的引用,例如\@array,当您取消引用它时,您将始终获得取消引用时@array指向的内容。当您取消引用@array(5 6 7 8)

当您执行[@array]时,就像将实时流录制到磁盘中一样。因此,当您(重新)播放录制的内容时,您会得到录制时流式传输的内容。因此,当您引用$arraycont[0]时,您会得到@array在复制时所拥有的
(1 2 3 4)

于 2012-05-01T07:44:04.340 回答
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
于 2018-06-18T20:06:38.387 回答