2009-11-18 109 views
1

我是編程新手,因此我被困在基本級別的問題上。如何查找一個數組中的哪些元素不在另一箇中?

以下是我爲比較而編寫的代碼。但是我得到的結果對我來說沒有意義。如果有人能告訴我發生了什麼問題,我將不勝感激。

有兩個數組:@array1,@array2長度不等。

我希望比較兩者並列出@ array1中不存在的值。

my %temp = map {$_,$_}@array2; 
for (@array1){ 
next if exists $temp{$_}; 
open (FILE, ">>/filename") or die "$!"; 
print FILE "$_\n"; 
close(FILE); 
} 
+2

也顯示你的輸入,你的輸出,和你預期的輸出。 – dave4420 2009-11-18 22:04:54

+2

爲什麼通常是這些新手問題的一個基本要素,否則我們這些幫助無法識別「X-Y問題」。 – 2009-11-18 22:14:13

回答

10

參見常見問題解答How do I compute the difference of two arrays? How do I compute the intersection of two arrays?

適應您發佈的代碼:

#!/usr/bin/perl 

use strict; use warnings; 

my @x = 1 .. 10; 
my @y = grep { $_ % 2 } @x; 

my %lookup = map { $_ => undef } @y; 

for my $x (@x) { 
    next if exists $lookup{$x}; 
    print "$x\n"; 
} 
+3

我通常會看到我的% @seen {@y} =(1)x @y;'而不是'map',但它們的含義相同。 – Ether 2009-11-18 22:28:41

+0

@其他 - 由於微優化是有趣的,因此我的becnhmarks顯示比「map」稍快。聰明,高效。 – 2009-11-18 22:38:49

+0

我無法抗拒使用哈希切片! :) – Ether 2009-11-19 03:27:26

1

交換@array1並在代碼@array2

5

如果你這樣做了測試,我認爲你是我會強烈建議在測試的新版本is_deeply ::更多

你必須更新測試::更多

cpanp install Test::More 

,或者如果你是Perl的5.5

cpan Test::More 

那麼你就必須使用它

use Test::More; 
tests => 1 
is_deeply (\@arr1, \@arr2, 'test failed'); 

如果你不這樣做測試,但你這樣做是對自省目的和陣列小,我建議使用XXX

cpanp install http://search.cpan.org/CPAN/authors/id/I/IN/INGY/XXX-0.12.tar.gz 

那麼你就必須使用它

use XXX; 
YYY [ \@arr1, \@arr2 ]; 
4

這是一些非常聰明的代碼。你的代碼或多或少與Perl常見問題解答相同。我可能會做到這一點,但是:

my %tmp = map { $_ => 1 } @array2; 
my @diff = grep { not exists $tmp{$_} } @array1; 

這一點會對@array1的一切,這不是在@array2,但是避免那些超出式循環結構的(耶函數式編程)。雖然我倒是真的是這樣的:

sub comp (\@\@) { 
    my %t = map { $_ => 1 } @{$_[1]}; 
    return grep { not exists $t{$_} } @{$_[0]}; 
} 

然後,你可以這樣做:

my @diff = comp(@array1, @array2); # get items in @array1 not in @array2 
@diff = comp(@arraty2, @array1); # vice versa 

或者你可以去CPANList::Compare::Functional::complement()做你想要的,雖然語法顛倒了。

0

對於像字符串或數字簡單的值,下面應該工作

my @result; 
my $hosts = [qw(host1 host2 host3 host4 host5)]; 
my $stie_obj = [qw(host1 host5 host6)]; 

@result = map { my $a=$_; my $b=grep {/$a/} @$site_obj; $b==0 ? $a :() } @$hosts; 
print Dumper (@result); 

應該給:

$VAR1 = 'host2'; 
$VAR2 = 'host3'; 
$VAR3 = 'host4'; 
相關問題