如何从哈希数组中合并哈希

  • 本文关键字:哈希 合并 数组 perl
  • 更新时间 :
  • 英文 :


输入数组:

my @input = (
{
Id => 1,
A => "abcd",
B => undef,
C => "rtyt"
},
{
Id => 1, 
A => undef,
B => "efgh", 
},
{
Id => 2,
A => "ifk",
B => "rjot",
},
);

期望输出:

my @output = (
{
Id => 1,
A => "abcd",
B => "efgh",
C => "rtyt"
},
{
Id => 2,
A => "ifk",
B => "rjot",
},
);

我在这里看到的其他解决方案要么包括来自第一个散列的额外值,要么包括来自第二个散列的附加值,但我需要两者。

哈希非常适合对事物进行分组。

# Keep first value in case of conflict.
my %by_id;
for my $rec (@input) {
my $id = $rec->{Id};
for my $k (keys(%$rec)) {
$by_id{$id}{$k} //= $rec->{$k};
}
}

# Keep last value in case of conflict.
my %by_id;
for my $rec (@input) {
my $id = $rec->{Id};
$by_id{$id} //= { %$rec };
for my $k (keys(%$rec)) {
if (defined($rec->{$k})) {
$by_id{$id}{$k} = $rec->{$k};
}
}
}

以上构建

my %by_id = (
"1" => {
Id => 1,
A => "abcd",
B => "efgh",
C => "rtyt",
},
"2" => {
Id => 2,
A => "ifk",
B => "rjot",
},
);

然后,我们可以简单地提取这些值。

my @output = @by_id{
sort { $a <=> $b }
keys(%by_id)
};

最新更新