我正試圖合并兩個包含串列的哈希值。 問題是,這些串列是完全相同的,但由于它們是串列,合并后它們內部的值會重復。
有什么想法可以讓我洗掉重復的內容嗎?
#!usr/bin/perl。
use strict;
使用警告。
use Hash::Merge;
use Data::Dumper;
$Data::Dumper::Sortkeys = 1;
my $hash1 = {
'Instance' => [ 1,2 ].
};
my $hash2 = {
'Instance' => [1,2 ]
};
my $merger = Hash::Merge->new('LEFT_PRECEDENT')。
my $hash3 = $merger->merge($hash2, $hash1);
print Dumper($hash3)。
輸出:
$VAR1 = {
'Instance' => [
1,
2,
1,
2.
]
};
我想要的是:
$VAR1 = {
'Instance' => [
1,
2, 2.
]
};
經過編輯。 我發布了一個持續的問題.
。uj5u.com熱心網友回復:
當你想用Hash::Merge做一些高級的事情時,答案通常是 "實作你自己的自定義行為"。
在這種情況下,你可以這樣做:
my $merger = Hash::Merge->new('LEFT_PRECEDENT') 。
my $behavior = $merger->get_behavior_spec($merger->get_behavior)。
$behavior->{ARRAY}{ARRAY} = sub{
my ($left, $right) = @_;
my%seen = map { $_ => 1 } @$left;
return [ @$left, grep { ! $seen{$_} } @$right ] 。
};
my $hash3 = $merger->merge($hash2, $hash1);
其中一行 my %seen = map { $_ => 1 } @$left;用$left陣列的值來填充散列%seen,并且grep { ! $seen{$_} } @$right 過濾$right陣列,只保留不在%seen中的值。
注意,這種方法并不能洗掉所有重復的元素:如果$left或$right包含重復的元素(例如,如果$left = [1, 1, 2]),那么這些重復的元素將會保留。如果你想洗掉所有的重復元素,那么請使用這個版本:
useList::MoreUtils qw(uniq);
$behavior->{ARRAY}{ARRAY} = sub{
my ($left, $right) = @_;
return [ uniq @$left, @$right ];
};
如果出于任何原因,你不想依賴List::MoreUtils的uniq函式,你可以輕松實作自己的。如何在Perl中洗掉陣列中的重復項?.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/311315.html
標籤:
下一篇:在粘貼前修改剪貼板的perl命令
