加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Perl中深入复制散列哈希的最佳方式是什么?

发布时间:2020-12-15 21:22:00 所属栏目:大数据 来源:网络整理
导读:Possible Duplicate: 07000 在我自己开始编写代码并重新开发轮子之前,如何复制散列哈希而不重复哈希表? 我正在通过Config::General读取哈希散列的哈希值,即数据结构是: my %config = ( group = { item1 = { foo = 'value',bar = 'value',},item2 = { foo

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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读