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, );