gpt4 book ai didi

perl - 从 perl 数组中删除重复的散列

转载 作者:行者123 更新时间:2023-12-01 21:49:01 24 4
gpt4 key购买 nike

我有如下的 perl 数组

my @arr = ({
CONTEXTID => 1230,
NAME => 'test8824',
PROVIDERID => 163
}, {
CONTEXTID => 8824,
NAME => 'test8824',
PROVIDERID => 77
}, {
CONTEXTID => 8824,
NAME => 'test8824',
PROVIDERID => 779
}, {
CONTEXTID => 8824,
NAME => 'test8824',
PROVIDERID => 141
}, {
CONTEXTID => 1230,
NAME => 'test8824',
PROVIDERID => 163
})

我想从数组中删除重复的散列,输出应该是这样的:

({
CONTEXTID => 1230,
NAME => 'test8824',
PROVIDERID => 163
}, {
CONTEXTID => 8824,
NAME => 'test8824',
PROVIDERID => 77
}, {
CONTEXTID => 8824,
NAME => 'test8824',
PROVIDERID => 779
}, {
CONTEXTID => 8824,
NAME => 'test8824',
PROVIDERID => 141
}
)

只有当hash的所有键都匹配时才会识别出重复,否则不重复。

最佳答案

以下是删除重复项的常用习惯用法:

my %seen;    
my @unique = grep !$seen{$_}++, @strings;

使用字符串比较来确定两个项目是否相同。这在我们的例子中是行不通的(因为这会有效地比较散列的地址,发现它们都是唯一的)。

但我们可以很容易地概括上面的内容如下:

my %seen;    
my @unique = grep !$seen{key($_)}++, @items;

我们现在只需要一个函数 key生成满足以下条件的字符串:

  • key($a) ne key($b)如果$a被认为不同于 $b .
  • key($a) eq key($b)如果$a被认为与 $b 相同.

在这种情况下,我们可以使用以下内容:

use feature qw( state );

use Cpanel::JSON::XS qw( );

sub key {
state $encoder = Cpanel::JSON::XS->new->canonical;
return $encoder->encode($_[0]);
}

关于perl - 从 perl 数组中删除重复的散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59783340/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com