在Perl中复制hashref

Bla*_*ppo 28 perl

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

我显然误解了一些关于hashrefs如何在Perl中工作的东西,我在这里想要纠正这个问题.

我需要获得一个hashref的副本,我可以在不修改原始文件的情况下进行操作.根据我的研究,复制hashref就像使用equals运算符一样简单:

my $hashref_copy = $hashref;
Run Code Online (Sandbox Code Playgroud)

但据我所知,所有这一切都是$hashref_copy指向原始对象的指针.考虑一下这个玩具代码:


my $hashref = {data => "fish"};

my $hashref_copy = $hashref;
$hashref_copy->{data} = "chips";

print "$hashref->{data}\n";
Run Code Online (Sandbox Code Playgroud)

如果$hashref_copy真的是一个独立的副本,我希望这个代码打印"鱼".相反,它打印"芯片".

所以要么1)我误解了一些事情,或者2)Perl被打破了.我很确定它不是#2,尽管我的自我会让我想到.

我哪里错了?我需要做些什么来使修改$hashref_copy 不会出现在原文中$hashref

Eri*_*rom 63

将hashref复制到另一个标量时,您将复制对同一哈希的引用.这类似于将一个指针复制到另一个指针,但不会更改任何指向的内存.

您可以轻松地创建哈希的浅表副本:

my $copy = { %$source };
Run Code Online (Sandbox Code Playgroud)

%$source列表上下文中的位将扩展为键值对列表.花括号(匿名散列构造函数)然后获取该列表,从中创建一个新的hashref.如果您的结构是一维的,或者如果您不需要克隆任何包含的数据结构,那么浅拷贝就可以了.

要执行完整深层复制,您可以使用核心模块Storable.

use Storable 'dclone';

my $deep_copy = dclone $source;
Run Code Online (Sandbox Code Playgroud)

  • 另见[`Clone`](http://search.cpan.org/perldoc?Clone) (2认同)

Kei*_*son 7

是的,赋值只是复制引用(就像在其他语言中复制指针值一样).您正在寻找的是一种"深层复制".

Storable::dclone似乎是一种解决方案(perldoc Storable更多信息).

Clone是另一个(perldoc clone); 感谢Zaid在评论中提到这一点.