my %presence; my $b = 1; foreach my $ary (\@list1, \@list2, \@list3) { foreach(@$ary) { $presence{$_} |= $b; } } continue { $b *= 2; } #### @list1only = grep { $presence{$_} == 1 } keys %presence; @list2only = grep { $presence{$_} == 2 } keys %presence; @list3only = grep { $presence{$_} == 4 } keys %presence; @lists1and2only = grep { $presence{$_} == 1+2 } keys %presence; @inall = grep { $presence{$_} == 1+2+4 } keys %presence; # etc