我正在尝试合并两个包含其中列表的哈希值。
问题是这些列表完全相同,但因为它们是列表,所以合并会在内部复制它们的值。
有什么想法如何删除重复项吗?
#!usr/bin/perl
use strict;
use warnings;
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
]
};
编辑后:
我发布了一个持续的question https://stackoverflow.com/questions/69174664/perl-hashmerge-duplicates-same-list-within-hashes-instead-of-putting-them-on.
通常当你想做一些高级的事情时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;
填充哈希值%seen
与价值观$left
数组,以及grep { ! $seen{$_} } @$right
过滤$right
数组,仅保留不在其中的值%seen
.
请注意,此方法不会删除所有重复项:如果$left
or $right
包含重复元素(例如,如果$left = [1, 1, 2]
),那么这些重复项将保留。如果您想删除所有重复项,请改用此版本:
use List::MoreUtils qw(uniq);
$behavior->{ARRAY}{ARRAY} = sub {
my ($left, $right) = @_;
return [ uniq @$left, @$right ];
};
如果出于任何原因您不想依赖List::MoreUtils https://metacpan.org/pod/List::MoreUtils为了uniq
函数,您可以轻松实现自己的:如何从 Perl 数组中删除重复项? https://stackoverflow.com/q/7651/4990392.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)