2014-01-15 22 views
0

我有兩個數組。我想找出第二個元素,而不是第一個元素,以及第一個元素,而不是第二個元素。如何比較Perl中的兩個數組

有沒有辦法寫出多個循環?

每個陣列是這樣的$ array_2d_1

0 ARRAY(0x9929210) 
    0 ARRAY(0x98df3d8) 
     0 71 
     1 22 
     2 15 
     3 10 
     4 51 
    1 ARRAY(0x9934900) 
     0 91 
     1 82 
     2 28 
     3 11 
     4 91 
+0

我正在嘗試使用多個for循環。但是想知道是否有更好的方法 – user1737619

+0

這取決於「比較」的含義,它取決於「循環」的含義。 :-) –

+0

我想找到差異。數組2中缺少什麼和額外的數字 – user1737619

回答

0

你不能避免循環。該解決方案有四個循環,但它們不是嵌套的。

my %a1 = map { $_ => 1 } @a1; 
my %a2 = map { $_ => 1 } @a2; 

my @missing_from_a1 = grep !$a1{$_}, @a2; 
my @missing_from_a2 = grep !$a2{$_}, @a1; 
0

我想你正在尋找類似於perl權限的設置實現。在標準的perl中沒有設置實現,這裏是cpan中的模塊,可以實現你正在嘗試解決的問題set。所以,我們必須找出一種方法來創建數組中的獨特元素,並且perl中的散列鍵是唯一的。通過使用哈希實現,我們可以實現集合實現。更多細節,你可以看看在這裏:

Set Implementation

1

您可以使用該模塊List::Compare此任務:

use strict; 
use warnings; 
use List::Compare; 

my @arr1 = qw/5 8 12 42 99 10/; 
my @arr2 = qw/10 20 12 18 99 10/; 

my $lc = List::Compare->new(\@arr1, \@arr2); 

my @arr1Only = $lc->get_Lonly; 
print "\@arr1 only: @arr1Only\n"; 

my @arr2Only = $lc->get_Ronly; 
print "\@arr2 only: @arr2Only\n"; 

輸出:

@arr1 only: 42 5 8 
@arr2 only: 18 20 

希望這有助於!

0

要取得兩組之間的設定差值,必須在某處存在循環。我假設你想避免在每次需要計算設置差異時寫出循環,而不是使用unhealthy aversion to loops

一個簡單的方法是將抽象掉操作成一個子程序:

#!/usr/bin/env perl 

use strict; 
use warnings; 

main(); 

sub main { 
    my @x = (1, 2, 3, 4, 5); 
    my @y = (3, 5, 7, 8, 9); 

    for my $sets (([\(@x, @y)], [\(@y, @x)])) { 
     print "@{ set_diff(@$sets) }\n"; 
    } 
} 

sub set_diff { 
    my $x = shift; 
    my %y = map { $_ => undef } @{ $_[0] }; 
    return [ grep not(exists $y{$_}), @$x ]; 
} 

也有許多的set implementations on CPAN