【问题标题】:How to avoid pushing duplicate values into a Perl array如何避免将重复值推入 Perl 数组
【发布时间】:2013-03-31 10:59:01
【问题描述】:

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

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

【问题讨论】:

标签: arrays perl


【解决方案1】:
push(@yourarray, $yourvalue) unless grep{$_ == $yourvalue} @yourarray;

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

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

【讨论】:

  • 随着数组变大,这种解决方案变得非常低效——首选哈希方法。
【解决方案2】:

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

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) ...

【讨论】:

  • 哇,这一定是新记录:答案在 4 年后被接受:)
【解决方案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";
}

【讨论】:

  • 简而言之:push(@yourarray, $yourvalue) unless $yourvalue ~~ @yourarray;
  • 请注意,智能匹配已降级为实验性,因为它的行为通常与人们的预期相反,并且存在其他问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多