可能重复:
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
是一个二维数组。
答案 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;