在给定一个数据结构(例如哈希的哈希)时,有哪些清晰/推荐的方法可以进行深度复制以供立即使用?假设合理情况下,数据不是特别大,不存在复杂的循环,并且可读性/可维护性等比速度更重要。
我知道可以使用Storable、Clone、Clone::More、Clone::Fast、Data::Dumper等工具。目前的最佳实践是什么?
在给定一个数据结构(例如哈希的哈希)时,有哪些清晰/推荐的方法可以进行深度复制以供立即使用?假设合理情况下,数据不是特别大,不存在复杂的循环,并且可读性/可维护性等比速度更重要。
我知道可以使用Storable、Clone、Clone::More、Clone::Fast、Data::Dumper等工具。目前的最佳实践是什么?
Clone
比Storable::dclone
快得多,但后者支持更多的数据类型。
Clone::Fast
和Clone::More
如果我没记错的话基本上是等效的,但比甚至比Clone还不完整,而Scalar::Util::Clone
支持的功能更少,但对于某些结构来说是最快的。
就可读性而言,它们应该都可以正常工作,几乎可以互换使用。
如果您没有特定的性能需求,我建议只使用Storable的dclone。
我不会使用Data::Dumper
,因为它太繁琐了。它可能也会非常慢。
值得一提的是,如果您需要可定制的克隆,则Data::Visitor
提供了挂钩功能,并且相当完整的深度克隆是默认行为。
我的印象是Storable::dclone()
有些经典。
fclone
,它似乎是最快的(用XS编写)。Clone
和Storable
都是用XS编写的。你所说的“似乎是最快的”,是什么意思? - melpomene如果你已经在处理JSON并在代码中使用JSON模块,那么可以采用快速而不太规范的方法:将结构转换为JSON,然后将JSON转换回结构:
use JSON;
my %hash = (
obj => {},
arr => []
);
my $hash_ref_to_hash_copy = from_json(to_json(\%hash));