2013-04-09 53 views
10

我需要从包含多个重复值的输入中添加数组中的唯一元素。如何避免将重复值推入Perl数组

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

+0

您可以使用一组的概念:http://stackoverflow.com/questions/3700037/how-can-i- represent-sets-in-perl – akonsu 2013-04-09 06:31:14

+0

如果你不反对CPAN,总会有'List :: MoreUtils' uniq函数。 – squiguy 2013-04-09 06:41:38

回答

12

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

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

哇,这一定是新的记录:答案接受4年后:) – mvp 2017-05-11 18:28:58

+1

他必须确定这工作。 ; P – 2017-11-28 16:31:20

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

推动。如果该值不存在,它将被推送。

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

+1

随着数组变大,此解决方案变得非常低效 - 散列方法是首选。 – 2013-04-09 06:40:52

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"; 
} 
+0

总之:'push(@yourarray,$ yourvalue)除非$ yourvalue ~~ @yourarray;' – Codr 2017-01-27 07:40:29