perl - Hash::Merge 在哈希中重复相同的列表,而不是将它们放置一次

2024-01-10

我正在尝试合并两个包含其中列表的哈希值。 问题是这些列表完全相同,但因为它们是列表,所以合并会在内部复制它们的值。

有什么想法如何删除重复项吗?

#!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(使用前将#替换为@)

perl - Hash::Merge 在哈希中重复相同的列表,而不是将它们放置一次 的相关文章

随机推荐