首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在perl中合并2个深度哈希

如何在perl中合并2个深度哈希
EN

Stack Overflow用户
提问于 2010-10-31 03:35:29
回答 2查看 3.9K关注 0票数 3

我在Perl中编写了一个sub来合并两个相同结构的散列;这样merge($a,$b)

代码语言:javascript
运行
复制
$a = {
 k1 => { sk1 => 'v1' },
 k2 => { sk3 => 'v3', sk4 => 'v4' }
};
$b = {
 k1 => { sk2 => 'v2'},
 k3 => { sk5 => 'v5'} 
};

会导致

代码语言:javascript
运行
复制
$c = {
 k1 => { sk1 => 'v1', sk2 => 'v2' },
 k2 => { sk3 => 'v3', sk4 => 'v4' }
 k3 => { sk5 => 'v5'} 
};

下面是我的合并代码,它不能工作。我该怎么纠正它呢?谢谢。

代码语言:javascript
运行
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-31 03:48:32

除非您这样做只是为了了解它是如何实现的,否则我会使用预先准备好的解决方案,如Hash::MergeHash::Merge::Simple

票数 10
EN

Stack Overflow用户

发布于 2010-10-31 05:44:16

这应该足够好了:

代码语言:javascript
运行
复制
for my $href ($a, $b) {
    while (my($k,$v) = each %$href) {
        $c->{$k} = $v;
    }
}

如果您不想重复,可能是因为您担心排序问题,那么可以使用:

代码语言:javascript
运行
复制
for my $href ($a, $b) {
    while (my($k,$v) = each %$href) {
        push @{ $c->{$k} },  $v;
    }
}

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

但请注意,这些是表面副本,因此引用将被共享。这不是深度拷贝。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4060331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档