在Perl中,默认情况下,对引用结构(例如,数组的数组或哈希的哈希)的复制是浅表的:只复制引用本身,而不是嵌套的内容。历史上,这常常会导致意外的效果——一个副本中的内部结构的更改会反映到其他副本中。解决方案:使用专门的方法和模块进行深度克隆,以创建具有独立嵌套元素的独立结构。
示例代码(使用Storable):
use Storable 'dclone'; my $original = { a => [1, 2, { x => 10 }] }; my $copy = dclone($original); $copy->{a}[2]{x} = 20; print $original->{a}[2]{x}; # 10
关键特点:
运算符“=”($copy = $ref)在深度复制中有效吗?
不,运算符“=”只复制引用本身。在这种赋值之后,任何对$copy的更改也会反映在$ref中。
可以使用Data::Dumper对结构进行深度复制吗?
Data::Dumper是一个用于调试和序列化为字符串的工具,并不适合恢复内存中的数据结构。对于反向转换,需要使用eval,这是危险的,不建议出于安全性和性能原因。
dclone总是能正确处理对象(被Blessed引用)吗?
Storable::dclone可以克隆对象,但仅在类没有重载序列化方法或不包含非标准对象(例如,文件描述符或强引用外部资源)时。对于复杂对象,需要实现方法STORABLE_freeze和STORABLE_thaw。
通过运算符=复制的数组内的数组,在其一个嵌套结构中进行更改——所有副本中都可见相同的更改。
优点:
缺点:
使用Storable::dclone或Clone::PP,所有嵌套结构都是独立的。
优点:
缺点: