【问题标题】:how to merge 2 deep hashes in perl如何在 perl 中合并 2 个深度哈希
【发布时间】:2010-10-31 05:44:16
【问题描述】:

我在 Perl 中编写了一个 sub 来合并 2 个相同结构的哈希;这样合并($a,$b)

$a = {
 k1 => { sk1 => 'v1' },
 k2 => { sk3 => 'v3', sk4 => 'v4' }
};
$b = {
 k1 => { sk2 => 'v2'},
 k3 => { sk5 => 'v5'} 
};

会导致

$c = {
 k1 => { sk1 => 'v1', sk2 => 'v2' },
 k2 => { sk3 => 'v3', sk4 => 'v4' }
 k3 => { sk5 => 'v5'} 
};

下面是我的合并代码,它不起作用。我该如何纠正?谢谢。

sub merge {
 my ($old,$new) = @_;
 foreach my $k (keys($old)) {
  if (exists $new->{$k}) {
   if (ref($old->{$k}) eq 'HASH') {
    merge($old->{$k},$new->{$k});
   } else {
    $new->{$k} = $old->{$k};
   } 
  } else { 
   $new->{$k} = $old->{$k};
  }
 }
 return $new;
}

【问题讨论】:

标签: perl algorithm hash merge


【解决方案1】:

除非您这样做只是为了了解它是如何完成的,否则我会使用像 Hash::MergeHash::Merge::Simple 这样的预制解决方案。

【讨论】:

  • 哦,我不知道它存在。谢谢
【解决方案2】:

这应该足够好了:

for my $href ($a, $b) {
    while (my($k,$v) = each %$href) {
        $c->{$k} = $v;
    }
}

如果您不想破坏重复项,可能是因为您担心排序问题,请改用:

for my $href ($a, $b) {
    while (my($k,$v) = each %$href) {
        push @{ $c->{$k} },  $v;
    }
}

自己做这个非常简单的操作的好处是它有助于开发基本 Perl 数据结构的工具,这对于流利使用该语言至关重要。

但请注意,这些是表面副本,因此将共享参考。这不是深拷贝。

我使用 each 而不是 keys,以便在您使用包含数百万个元素的 DBM 哈希时进行扩展。

【讨论】:

    猜你喜欢
    • 2012-10-26
    • 2011-08-03
    • 2014-04-16
    • 2014-05-06
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 2013-04-18
    相关资源
    最近更新 更多