use strict; use warnings; my @array1 = ( 1, 2, 5, 9, 11, 12, 13 ); my @array2 = ( 1, 2, 5, 11, 12, 13 ); my @array3 = ( 1, 2, 5, 7, 9, 12, 13 ); use Set::Scalar; my $x = Set::Scalar->new(@array1); my $y = Set::Scalar->new(@array2); my $z = Set::Scalar->new(@array3); # Either way works. #my $answer = $x->union($y,$z) # - $x->unique($y,$z) # - $x->intersection($y,$z); my $answer = ($x + $y + $z) - ($x / $y / $z) - ($x * $y * $z); my @only_two = $answer->elements(); #### { 1 => [ 0, 1, 2 ], 2 => [ 0, 1, 2 ], 5 => [ 0, 1, 2 ], 7 => [ 2 ], 9 => [ 0, 2 ], 11 => [ 0, 1 ], 12 => [ 0, 1, 2 ], 13 => [ 0, 1, 2 ], } #### use List::Compare; sub elements_found_in_exactly_n_lists { my ($n, @array_refs) = @_; my $lc = List::Compare->new(@array_refs); my @u = $lc->get_union(); my %h = %{ $lc->are_members_which(\@u) }; return grep { @{$h{$_}} == $n } keys %h; } my @only_two = elements_found_in_exactly_n_lists( 2, \@array1, \@array2, \@array3, );