2016-02-16 80 views
1

我有2D數組(@AoA),它包含對其他字符串數組的引用。這個@AoA的大小每次都不一樣。我想比較每個這些字符串數組。
爲字符串的第一個數組進行相互比較,我可以用這樣的:比較perl中的多個數組

for (my $i=0; $i < $#AoA; $i++) { 
    my $lcm = List::Compare->new($aAoA[$i], $AoA[$i+1]); 
    my @intersection = $lcm->get_intersection; 
    if (@intersection) { 
     #some code here 
    } 

但如何相互比較每個數組的最佳方式? 我想結果是這樣的:

 Arr1 Arr2  ….   ArrN 
Arr1 x  1 match 3 matches 0 matches 
Arr2   x  N matches 3 matches 
….       x  1 match 
ArrN         x 
+0

如果列表進行排序,你可能可以做更有效。他們? – neuhaus

+0

@ neuhasus不,他們沒有排序。每個列表中的元素順序包含特定的信息。 –

+0

你可能會濫用Test :: Deep。 – simbabque

回答

0

如果你覺得舒服名單::比較,那麼你可以用它代替我的功能intersect_count的。

#!/usr/bin/perl 
use strict; 
use warnings; 
use List::MoreUtils 'uniq'; 
use List::Util 'any'; 

my @AoA = ([1,2,3,4,], [3,4,5,6], [4,7,8,9], [11,22,33]); 

my @hdrs = map "Array_$_", 1 .. @AoA; 
my $fmt = "%-10s" . "%-10s" x @hdrs . "\n"; 

printf $fmt, ' ', @hdrs; 

for (my $i=0; $i < $#AoA; $i++) { 
    my @matches; 
    for (my $j = $i+1; $j < @AoA; $j++) { 
     $matches[$j] = intersect_count($AoA[$i], $AoA[$j]); 
    } 
    printf $fmt, $hdrs[$i], map $_ // ' ', @matches; 
} 

sub intersect_count { 
    my ($a1, $a2) = @_; 
    my $cnt; 
    for my $item (uniq @$a1) { 
     $cnt += any {$item eq $_} uniq @$a2; 
    } 
    return $cnt; 
} 

這將打印

.   Array_1 Array_2 Array_3 Array_4 
Array_1    2   1   0 
Array_2      1   0 
Array_3         0 
+0

非常感謝!它有助於! –