40

给定一个数据结构(例如散列的散列),制作深层副本以供立即使用的干净/推荐方法是什么?假设合理的情况,数据不是特别大,不存在复杂的循环,可读性/可维护性/等。不惜一切代价比速度更重要。

我知道我可以使用StorableClone、 Clone::More、Clone::FastData::Dumper等。目前的最佳实践是什么?

4

5 回答 5

18

Clone比 快得多Storable::dclone,但后者支持更多的数据类型。

Clone::FastClone::More如果记忆对我有用的话,它们几乎是等价的,但功能的完整性甚至比克隆还要少,Scalar::Util::Clone支持的更少,但对于某些结构,IIRC 是最快的。

就可读性而言,这些都应该是一样的,它们实际上是可以互换的。

如果您没有特定的性能需求,我只会使用 Storable 的 dclone。

我不会Data::Dumper仅仅因为它太麻烦和迂回而使用它。它可能也会很慢。

对于它的价值,如果您想要可定制的克隆,那么Data::Visitor提供挂钩功能并且相当完整的深度克隆是默认行为。

于 2008-12-24T03:54:24.230 回答
16

我的印象是这Storable::dclone()有点规范。

于 2008-12-23T04:47:21.690 回答
7

克隆可能是您想要的。至少,这就是我见过的所有代码的用途。

于 2008-12-23T06:08:03.417 回答
0

尝试fclonePanda::Lib中使用,这似乎是最快的(用 XS 编写)

于 2019-02-01T18:33:27.623 回答
-1

如果您已经在处理 JSON 并在代码中使用 JSON 模块,那么快速而肮脏的 hack:将结构转换为 JSON,然后将 JSON 转换回结构:

use JSON;

my %hash = (
    obj => {},
    arr => []
);

my $hash_ref_to_hash_copy = from_json(to_json(\%hash));

唯一的缺点可能是必须处理散列引用而不是纯散列,但是,这对我来说已经派上用场了几次。

于 2021-12-01T11:26:04.170 回答