可能的重复问题:
如何最佳地在Perl中创建数据结构的深层拷贝?
在我开始自己编写代码并重复造轮子之前,如何复制一个哈希表的哈希表而不复制哈希引用?
我正在通过Config::General读取哈希表的哈希表的哈希表,即数据结构为:
my %config = ( group => { item1 => { foo => 'value',
bar => 'value',
},
item2 => { foo => 'value',
bar => 'value',
},
item3 => { foo => 'value',
bar => 'value',
},
},
);
我通过取消引用(config)得到我的组,然后在重写配置文件之前在运行时更改其内容:
my %group = %{$config{'group'}};
问题在于我需要检查是否进行了更改,并对系统文件结构进行相关更改。我无法通过检查来实现这一点:
if ($group{'item1'}{'foo'} ne $config{'group'}{'item1'}{'foo'}) {
### Stuff!
}
由于$group{'item1'}
和$config{'group'}{'item1'}
都是完全相同的哈希引用,因此应该很容易地重新解析配置文件,并将从磁盘中解析的副本与在保存到磁盘之前编辑的版本进行比较。不过,我相信有一种方法可以对复杂数据结构进行嵌套解引用,复制哈希引用的内容而不仅仅是复制引用本身。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次迭代计时... Clone: 2秒墙钟时间 ( 2.26用户 + 0.01系统 = 2.27 CPU) @ 44052.86/s (n=100000) Storable: 5秒墙钟时间 ( 4.71用户 + 0.02系统 = 4.73 CPU) @ 21141.65/s (n=100000)