在我开始自己编写代码并重新发明轮子之前,如何在不复制 hashref 的情况下复制散列散列?
我正在通过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!
}
as$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 }},
});
结果是:
基准测试:对 Clone、Storable 的 100000 次迭代计时... 克隆:2 挂钟秒(2.26 usr + 0.01 sys = 2.27 CPU)@ 44052.86/s (n=100000) 可存储:5 挂钟秒(4.71 usr + 0.02 sys = 4.73 CPU)@ 21141.65/s (n=100000)