2

哈希中的每个键都有多个值。在这里,我打印每个键的值

print "$var:",join ',',@{$hash{$var}},"\n";

上述打印语句的输出为:

ABC:1,2,3,1,4,2,
DEF:9,3,4,5,3,5,

现在,我想删除值中的重复项。所需的输出是,

ABC:1,2,3,4
DEF:9,3,4,5

有人可以帮助我吗?

谢谢

4

4 回答 4

3

使用List::MoreUtils::uniq

@$_ = uniq @$_ foreach values %hash;
于 2012-10-16T18:38:20.250 回答
3

就个人而言,我喜欢List::MoreUtils的 uniq 处理这个问题的方式。子程序非常简单,可以按原样使用,也可以通过模块使用。

my %seen;
my @dedupe = grep { not $seen{$_}++ } @{$hash{$var}};

模块中的子例程如下所示:

sub uniq (@) {
    my %seen = ();
    grep { not $seen{$_}++ } @_;
}

此代码保留列表的初始顺序。

于 2012-10-16T19:12:26.197 回答
2

它在哈希中是无关紧要的。您想要做的是对数组中的值进行重复数据删除。

查看uniq()List::MoreUtils 模块中的函数http://search.cpan.org/dist/List-MoreUtils/

你也可以像这样自己做:

my %h = map {($_,1)} @array_with_dupes;
my @deduped_array = keys %h;

这在Perl 常见问题解答中的“数据:数组”下都有广泛的介绍。

于 2012-10-16T18:35:09.523 回答
2

如果您尝试从数组中删除重复值,您可以使用它

#!/usr/bin/perl -w
use strict;
my @array = ('a','b','c','c','e');
my %hash = map { $_ => 1 } @array;
my @out = keys %hash;
printf("%s",join(',',@out));
于 2012-10-16T18:40:17.103 回答