如何避免将重复的值添加到 Perl 数组中

16

我需要将包含多个重复值的输入中的唯一元素添加到数组中。

如何避免将重复值推入 Perl 数组中?


您可以使用“集合”的概念:https://dev59.com/M3A65IYBdhLWcg3wqQc8 - akonsu
如果你不反对使用 CPAN,那么总是可以使用 List::MoreUtils 的 uniq 函数。 - squiguy
3个回答

22
push(@yourarray, $yourvalue) unless grep{$_ == $yourvalue} @yourarray;

在推送之前,这将检查该值是否存在于数组中。如果该值不存在,则会被推送。

如果该值不是数字,您应该使用eq而不是==


3
随着数组的增大,这种解决方案效率变得非常低下——散列方法更可取。 - user1919238
1
上面的答案是正确的,但如果在上面/下面的语句中使用 $,例如从文件中读取时使用 chomp($),它将无法工作。以下代码:" push(@yourarray, $yourvalue) unless $yourvalue ~~ @yourarray; " 可以完美地解决这个问题。 - Aquaholic

20

你只需要像这样使用哈希:

my %hash;
$hash{$key} = $value;  # you can use 1 as $value
...

这将自动覆盖重复的键。

当您需要打印它时,只需使用:

foreach my $key (keys %hash) {
    # do something with $key
}

如果您需要对键进行排序,请使用

foreach my $key (sort keys %hash) ...

9
哇,这一定是新纪录:回答被接受了四年之后 :) - mvp

3
通过使用~~,我们可以将最低Perl版本设置为5.10.1。
use v5.10.1;
use strict;
use warnings;

my @ARRAY1 = qw/This is array of backup /;
my @ARRAY2;
my $value = "version.xml";

sub CheckPush($$) {
    my $val = shift (@_);
    my $array_ref = shift (@_);

    unless ($val ~~ @$array_ref) {
        print "$val is going to push to array\n";
        push(@$array_ref, $val);
    }

    return (@$array_ref);
} 

@ARRAY1 = CheckPush($value, \@ARRAY1);
print "out\n";

foreach (@ARRAY1) {
    print "$_\n";
}

@ARRAY2 = CheckPush ($value, \@ARRAY2);
print "out2\n";

foreach (@ARRAY2) {
    print "$_\n";
}

3
简而言之:push(@yourarray, $yourvalue) unless $yourvalue ~~ @yourarray;翻译:将 $yourvalue 添加到 @yourarray 中,前提是 $yourvalue 不在 @yourarray 中。 - Codr
1
请注意,智能匹配已被降级为实验性功能,因为它经常表现出与人们预期相反的行为,并存在其他问题。 - brian d foy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接