2011-07-16 62 views

回答

2
my @array3; 
foreach my $elem (@array1) 
{ 
    if(!grep($elem eq $_, @array2)) 
    { 
     push(@array3, $elem); 
    } 
} 
15

將所述第二陣列中的元素到一個哈希,爲了有效檢查,以查看是否一個特定的元素在它,然後過濾所述第一陣列的只是那些沒有所述第二數組中的元素:

my %array2_elements; 
@array2_elements{ @array2 } =(); 
my @array3 = grep ! exists $array2_elements{$_}, @array1; 
+0

+1好的作品:) – vol7ron

+0

+1對我自己的答案的短版本(並適應我自己的答案)。 – Flimzy

0
my %total; 
$total{$_} = 1 for @array1; 
delete $total{$_} for @array2; 
my @diff = keys %total; 
+0

如果保留數組的順序並不重要,這是一個很好的方法。 – Flimzy

+0

是的,這是使用哈希的缺點。 – TLP

0

您可以使用名爲List::Compare的cpan模塊。

use List::Compare; 
    my $lc = List::Compare->new(\@array1,\@array2); 
    my @newarray = $lc->get_symdiff; 
1

使用散列作爲查找表。其鍵是所述第二數組的元素,值並不重要:

#!/usr/bin/env perl 
use strict; 
use warnings; 

my @array1 = ("abc", "cde", "fgh", "ijk", "lmn"); 
my @array2 = ("abc", "fgh", "lmn"); 

my @array1only; 

# build lookup table 
my %seen; 
foreach my $elem (@array2) { 
    $seen{$elem} = 1; 
} 

# find elements present only in @array1 
foreach my $elem (@array1) { 
    push @array1only, $elem unless $seen{$elem}; 
} 

print "Elements present only in \@array1: ", join(", ", @array1only), "\n"; 

更多見的配方4.8 Perl Cookbook

相關問題