我在Perl中编写了一个sub来合并两个相同结构的散列;这样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;
}
发布于 2010-10-30 19:48:32
除非您这样做只是为了了解它是如何实现的,否则我会使用预先准备好的解决方案,如Hash::Merge或Hash::Merge::Simple。
发布于 2010-10-30 21:44:16
这应该足够好了:
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 hashes时进行扩展。
https://stackoverflow.com/questions/4060331
复制相似问题