use strict; use warnings; use Set::Scalar; my @array1 = qw(c d e); my @array2 = qw(e f g h); my @array3 = qw(a b d); my @array4 = qw(s g h j k l); my @metaArray = (\@array1, \@array2, \@array3, \@array4, ); for my $first (0 .. $#metaArray - 1) { for my $second ($first + 1 .. $#metaArray) { my (%union, %intersect); $union{$_}++ && $intersect{$_}++ foreach @{$metaArray[$first]}, @{$metaArray[$second]}; my @intersect = sort keys %intersect; print "\@array$first, \@array$second: @intersect - "; print scalar @intersect, "\n"; } }