2010-10-30 56 views
3

我写在Perl子合并2个散列结构相同;这样会导致该合并($ A,$ B)如何合并在Perl 2个深哈希

$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; 
} 
+0

可能的重复[如何在Perl中结合散列?](http://stackoverflow.com/questions/350018/how-can-i-combine-hashes-in-perl) – Ether 2010-10-30 23:20:18

回答

8

除非你这样做只是为了学习它是如何做,我会使用一个预先制备像Hash::MergeHash::Merge::Simple

+0

哦,我没有知道它存在。谢谢 – Martin08 2010-10-30 19:54:57

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散列的情况下进行缩放。