Possible Duplicate:
07000
在我自己开始编写代码并重新开发轮子之前,如何复制散列哈希而不重复哈希表?
我正在通过Config::General读取哈希散列的哈希值,即数据结构是:
my %config = ( group => { item1 => { foo => 'value',bar => 'value',},item2 => { foo => 'value',item3 => { foo => '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',); 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)
解决方法
use Storable qw(dclone); $group2 = dclone(\%group);