比较perl中的多个数组

时间:2016-02-16 09:16:34

标签: arrays perl

我有2D数组(@AoA),它包含对其他字符串数组的引用。每次@AoA的大小都不同。我想将这些字符串中的每一个相互比较 为了比较第一个字符串数组,我可以使用这样的东西:

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

1 个答案:

答案 0 :(得分:0)

如果您对List :: Compare感到满意,那么您可以使用它而不是我的函数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