给定一个数据结构(例如散列的散列),制作深层副本以供立即使用的干净/推荐方法是什么?假设合理的情况,数据不是特别大,不存在复杂的循环,可读性/可维护性/等。不惜一切代价比速度更重要。
我知道我可以使用Storable、Clone、 Clone::More、Clone::Fast、Data::Dumper等。目前的最佳实践是什么?
给定一个数据结构(例如散列的散列),制作深层副本以供立即使用的干净/推荐方法是什么?假设合理的情况,数据不是特别大,不存在复杂的循环,可读性/可维护性/等。不惜一切代价比速度更重要。
我知道我可以使用Storable、Clone、 Clone::More、Clone::Fast、Data::Dumper等。目前的最佳实践是什么?
Clone
比 快得多Storable::dclone
,但后者支持更多的数据类型。
Clone::Fast
Clone::More
如果记忆对我有用的话,它们几乎是等价的,但功能的完整性甚至比克隆还要少,Scalar::Util::Clone
支持的更少,但对于某些结构,IIRC 是最快的。
就可读性而言,这些都应该是一样的,它们实际上是可以互换的。
如果您没有特定的性能需求,我只会使用 Storable 的 dclone。
我不会Data::Dumper
仅仅因为它太麻烦和迂回而使用它。它可能也会很慢。
对于它的价值,如果您想要可定制的克隆,那么Data::Visitor
提供挂钩功能并且相当完整的深度克隆是默认行为。
我的印象是这Storable::dclone()
有点规范。
克隆可能是您想要的。至少,这就是我见过的所有代码的用途。
尝试fclone
从Panda::Lib中使用,这似乎是最快的(用 XS 编写)
如果您已经在处理 JSON 并在代码中使用 JSON 模块,那么快速而肮脏的 hack:将结构转换为 JSON,然后将 JSON 转换回结构:
use JSON;
my %hash = (
obj => {},
arr => []
);
my $hash_ref_to_hash_copy = from_json(to_json(\%hash));
唯一的缺点可能是必须处理散列引用而不是纯散列,但是,这对我来说已经派上用场了几次。