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

Her*_*son 8 arrays perl copy

可能重复:
在Perl中制作数据结构的深层副本的最佳方法是什么?

在我的代码我做:

@data_new=@data;
Run Code Online (Sandbox Code Playgroud)

然后我改变了@data.

问题是@data_new总是会发生变化.这就像@data_new只是对内容的参考@data.

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

@data 顺便说一句,这是一个二维数组.

Emi*_*Sit 27

请参阅perlfaq4的"如何打印或复制递归数据结构".也就是说,使用dclone方法Storable.

use Storable qw(dclone);
@data_new = @{ dclone(\@data) }
Run Code Online (Sandbox Code Playgroud)


cdh*_*wie 17

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

如果要复制所有引用的对象,则必须对列表进行"深层复制".有关实现此目的的一些方法,请参阅此问题.

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

@data_new = map { [@$_] } @data;
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个深刻的副本,而是一个"稍微浅一点"的副本.:) (7认同)
  • 只是添加一点清晰度...... (3认同)