在Perl中,如何制作数组的深层副本?

时间:2010-12-08 16:51:33

标签: arrays perl copy

  

可能重复:
  What's the best way to make a deep copy of a data structure in Perl?

在我的代码中我做了:

@data_new=@data;

然后我改变@data

问题是@data_new总是会发生变化。 就像@data_new只是对@data中的内容的引用一样。

如何复制一个不是参考但是所有值的新副本的数组?

顺便说一句,

@data是一个二维数组。

2 个答案:

答案 0 :(得分:27)

perlfaq4's "How do I print out or copy a recursive data structure"。也就是说,使用dclone中的Storable方法。

use Storable qw(dclone);
@data_new = @{ dclone(\@data) }

答案 1 :(得分:16)

您拥有的代码将列表内容复制到新列表中。但是,如果要在列表中存储引用(并且必须在Perl中创建二维数组),则会复制引用,而不是引用指向的对象。因此,当您通过一个列表操作其中一个引用的对象时,看起来好像另一个列表正在更改,而实际上两个列表只包含相同的引用。

如果要复制所有引用的对象,则必须对列表进行“深层复制”。有关实现此目的的一些方法,请参阅this question

鉴于你的二维数组的情况,这应该工作:

@data_new = map { [@$_] } @data;