如何合并在Perl 2深散列 [英] how to merge 2 deep hashes in perl

查看:129
本文介绍了如何合并在Perl 2深散列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写在Perl子合并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}
};
 

下面是我的code的合并,这是行不通的。我该如何纠正呢?谢谢你。

 子合并{
 我($岁,$新)= @_;
 我的foreach $ K(密钥($岁)){
  如果(存在$新建 - > {$ķ}){
   如果(REF($ OLD-> {$ķ})EQ'HASH'){
    合并($ OLD-> {$ķ},$新建 - > {$ķ});
   } 其他 {
    $新建 - > {$ķ} = $ OLD-> {$ķ};
   }
  } 其他 {
   $新建 - > {$ķ} = $ OLD-> {$ķ};
  }
 }
 返回$新;
}
 

解决方案

除非你这样做只是为了了解它是如何做,我会使用一个premade解决方案像的Hash::Merge 或的哈希::合并::简单

I write a sub in Perl to merge 2 hashes of the same structure; so that merge($a,$b)

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

would result in

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

Below is my code for merge, and it does not work. How can I correct it? Thank you.

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

解决方案

Unless you're doing this just to learn how it's done, I'd use a premade solution like Hash::Merge or Hash::Merge::Simple.

这篇关于如何合并在Perl 2深散列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆