my %seen; $seen{$_}|=1<<0 for @list1; $seen{$_}|=1<<1 for @list2; my @intersection = grep $seen{$_}==(1<<2)-1, keys %seen;