如果发现重复,请删除Perl哈希值
我需要一个快速的帮助,我正在Unix服务器中对一些命令进行灰色处理,并将这些命令创建一个散列 问题是大多数情况下,会出现重复的值,我想从这些散列中删除任何重复的值 以下是一个例子:如果发现重复,请删除Perl哈希值,perl,hash,Perl,Hash,我需要一个快速的帮助,我正在Unix服务器中对一些命令进行灰色处理,并将这些命令创建一个散列 问题是大多数情况下,会出现重复的值,我想从这些散列中删除任何重复的值 以下是一个例子: [randy@server04 ~/scripts]$ perl snmpperl.pl $VAR1 = { '1b' => [ 'abc_pl', 'abc_pl', 'abc_pl', 'xyz_pl', 'xyz_p
[randy@server04 ~/scripts]$ perl snmpperl.pl
$VAR1 = {
'1b' => [
'abc_pl',
'abc_pl',
'abc_pl',
'xyz_pl',
'xyz_pl',
],
'1a' => [
'abc_pl',
'abc_pl',
'abc_pl',
'abc_pl',
'xyz_pl',
'xyz_pl',
]
我需要的哈希是:-
$VAR1 = {
'1b' => [
'abc_pl',
'xyz_pl',
],
'1a' => [
'abc_pl',
'xyz_pl',
]
这是一个相对常见的Perl习惯用法,实际上在FAQ中有介绍,您可以在安装了Perl的任何系统上键入
perldoc-qduplicate
,找到它
以下是对常见问题解答中表达的观点的改编:
use strict;
use warnings;
use Data::Dumper;
my %hash = (
'1b' => [ 'abc_pl', 'abc_pl', 'abc_pl', 'xyz_pl', 'xyz_pl', ],
'1a' => [ 'abc_pl', 'abc_pl', 'abc_pl', 'abc_pl', 'xyz_pl', 'xyz_pl', ],
);
foreach my $v ( values %hash ) {
my %seen;
@$v = grep { !$seen{$_}++ } @$v;
}
print Dumper \%hash;
这是通过跟踪给定哈希键的子数组中的任何给定元素之前是否已被看到来实现的。如果没有,则将其通过grep过滤器。否则,不要发送它。最后,构建到新结构中的所有内容都是数组元素的单个实例
值得一提的细微差别;
foreach
循环中的“it”变量成为它所表示的元素的别名。因此,在本例中,对于循环的每次迭代,$v
将一个哈希元素化名,该元素的值包含一个匿名数组引用。我们只需将匿名数组ref的内容替换为重复数据消除的元素。这是一种相对常见的Perl习惯用法,实际上在常见问题解答中有介绍,您可以通过在任何安装了Perl的系统上键入perldoc-q duplicate
找到它
use List::MoreUtils 'uniq';
@$_ = uniq @$_ for values %hash;
以下是对常见问题解答中表达的观点的改编:
use strict;
use warnings;
use Data::Dumper;
my %hash = (
'1b' => [ 'abc_pl', 'abc_pl', 'abc_pl', 'xyz_pl', 'xyz_pl', ],
'1a' => [ 'abc_pl', 'abc_pl', 'abc_pl', 'abc_pl', 'xyz_pl', 'xyz_pl', ],
);
foreach my $v ( values %hash ) {
my %seen;
@$v = grep { !$seen{$_}++ } @$v;
}
print Dumper \%hash;
这是通过跟踪给定哈希键的子数组中的任何给定元素之前是否已被看到来实现的。如果没有,则将其通过grep过滤器。否则,不要发送它。最后,构建到新结构中的所有内容都是数组元素的单个实例
值得一提的细微差别;foreach
循环中的“it”变量成为它所表示的元素的别名。因此,在本例中,对于循环的每次迭代,$v
将一个哈希元素化名,该元素的值包含一个匿名数组引用。我们只是用重复数据消除的元素替换匿名数组ref的内容
use List::MoreUtils 'uniq';
@$_ = uniq @$_ for values %hash;
替换来自的uniq
替换来自的uniq
如果值的顺序不相关,则可能重复。如果值的顺序不相关,则可能重复。如果值的顺序不相关,则可能重复。如果值的顺序不相关,则可以使用哈希(多维哈希)列表替换数组::MoreUtils的优点是,对于具有多个重复项的列表,速度快2到3倍(没有的列表也差不多。)@Schwern tnx供参考。顺便说一句,你能分享一下你对哪些实用模块有用的看法吗(比如
Path::Tiny
?)我可以做得更好。我可以将它们放入一个名为的内聚模块中。除了perl5i:Path::Tiny、Method::Signatures和Mouse。@Schwern我没想到您会立即编写一个。:)
Tnx用于可以放入核心的模块。List::MoreUtils的优点是,对于具有许多重复项的列表,速度要快2到3倍(没有的列表也差不多。)@Schwern tnx供参考。顺便说一句,你能分享一下你对哪些实用模块有用的看法吗(比如Path::Tiny
?)我可以做得更好。我可以将它们放入一个名为的内聚模块中。除了perl5i:Path::Tiny、Method::Signatures和Mouse。@Schwern我没想到您会立即编写一个。:)
Tnx用于可以放入核心的模块。