可能重复:
What's the best way to make a deep copy of a data structure in Perl?在Perl中深入复制散列哈希的最佳方式是什么?
在我开始这个编码自己,重新发明轮子,你怎么复制哈希散列而非复制hashrefs?
我正在通过Config::General阅读散列哈希散列。即数据结构为:
my %config = (group => { item1 => { foo => 'value',
bar => 'value',
},
item2 => { foo => 'value',
bar => 'value',
},
item3 => { foo => 'value',
bar => 'value',
},
},
);
然后我提领它拉我的团队从配置和重写配置文件之前,在运行时更改的内容:
my %group = %{$config{'group'}};
的问题是,我需要检查是否进行了更改并对系统的文件结构进行相关更改。我无法通过检查做到这一点:
if ($group{'item1'}{'foo'} ne $config{'group'}{'item1'}{'foo'}) {
### Stuff!
}
为$group{'item1'}
和$config{'group'}{'item1'}
都是完全相同的hashref。
现在虽然只需简单地重新解析配置文件,并且在保存到磁盘之前比较从磁盘分析的拷贝和编辑的版本,但我确信有一种方法可以嵌套解除引用一个复杂的数据结构,复制散列引用的内容,而不是简单地复制引用本身。对CPAN进行粗略的检查并没有改变任何事情。我错过了什么?
基准
得到了我的答案是:
#!/usr/bin/perl
use Benchmark qw(:all) ;
use Storable qw(dclone);
use Clone qw(clone);
my %config = (group => { item1 => { foo => 'value',
bar => 'value',
},
item2 => { foo => 'value',
bar => 'value',
},
item3 => { foo => 'value',
bar => 'value',
},
},
);
my $ref = $config{'group'};
timethese(100000, {
'Clone' => sub { my %group = %{ clone $ref }},
'Storable' => sub { my %group = %{ dclone $ref }},
});
结果:
Benchmark: timing 100000 iterations of Clone, Storable... Clone: 2 wallclock secs (2.26 usr + 0.01 sys = 2.27 CPU) @ 44052.86/s (n=100000) Storable: 5 wallclock secs (4.71 usr + 0.02 sys = 4.73 CPU) @ 21141.65/s (n=100000)
如你所说,你得到了答案,你应该检查回答你的问题的帖子是正确的答案。 –