我正在嘗試在 perl 中進行合并,其中包含散列的陣列,我試圖在合并時不合并uniq陣列中的重復元素(通過函式)。
use strict;
use Hash::Merge qw/merge/;
use List::MoreUtils qw/uniq/;
use Data::Dumper;
my $h1 = { name1 => [ {
sport => "tennis",
country => "us",
},
{
sport => "soccer",
country => "brazil",
},
{
sport => "cricket",
country => "india"
},
]
};
my $h2 = { name1 => [ {
sport => "soccer",
country => "brazil",
},
{
sport => "boxing",
country => "china"
}
],
};
輸出:-
$VAR1 = {
'name1' => [
{
'country' => 'us',
'sport' => 'tennis'
},
{
'country' => 'brazil',
'sport' => 'soccer'
},
{
'sport' => 'cricket',
'country' => 'india'
},
{
'country' => 'brazil',
'sport' => 'soccer'
},
{
'country' => 'china',
'sport' => 'boxing'
}
]
};
當我嘗試使用自定義合并方法進行合并時,我無法消除重復元素 ( { sport => "soccer" country => "brazil" })。似乎原因是因為hash格式中的元素。我們有什么簡單的方法可以使用自定義合并技術來實作它。謝謝!
uj5u.com熱心網友回復:
您可以嘗試展平陣列中的子哈希,以便能夠應用于uniq它們。然后在洗掉重復項后擴展子哈希。例如:
Hash::Merge::specify_behavior(
{
SCALAR => {
SCALAR => sub { $_[1] },
ARRAY => sub { [ $_[0], @{$_[1]} ] },
HASH => sub { $_[1] },
},
ARRAY => {
SCALAR => sub { $_[1] },
ARRAY => sub { my_array_merge( $_[0], $_[1] ) },
HASH => sub { $_[1] },
},
HASH => {
SCALAR => sub { $_[1] },
ARRAY => sub { [ values %{$_[0]}, @{$_[1]} ] },
HASH => sub { Hash::Merge::_merge_hashes( $_[0], $_[1] ) },
},
},
'setting merge',
);
my $h_data = merge($h1, $h2);
print Dumper $h_data;
sub flatten_array_of_hash {
my ( $ar ) = @_;
my @flat;
for my $hash (@$ar) {
die "Not hash ref" if !(ref $hash eq "HASH");
my @ar;
for my $key (sort keys %$hash) {
push @ar, join $;, $key, $hash->{$key};
}
push @flat, join $;, @ar;
}
return \@flat;
}
sub my_array_merge {
my ($a1, $a2) = @_;
my $f1 = flatten_array_of_hash( $a1 );
my $f2 = flatten_array_of_hash( $a2 );
my @flat = uniq @$f1, @$f2;
my @result;
for my $item (@flat) {
my %hash = split $;, $item;
push @result, \%hash;
}
return \@result;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/316276.html
上一篇:使樹散列正確路徑
