如何在Perl中合并两个深层哈希?

3
我用Perl写了一个子程序来合并两个相同结构的哈希表,使得merge($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中合并哈希?的重复问题。 - Ether
2个回答

10

哦,我不知道它存在。谢谢。 - Martin08

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哈希。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接