my %count; $count{$_}++ for @temp; my @non_unique_intersection = grep { $count{$_}-->0 } @temp2; #### # my @non_unique_intersection = nonunique_intersect( \@temp, \@temp2 ); sub nonunique_intersect { my ($x, $y) = @_; my %count; $count{$_}++ for @$x; my @return = grep { $count{$_}-->0 } @$y; return wantarray ? @return : \@return; } #### my %count; $count{$_}++ for @temp; my @non_unique_intersection = grep { $count{$_}-->0 } @temp2; my (@leftovers, @leftovers2); push @{$count{$_}>0 ? \@leftovers : \@leftovers2}, ($_) x abs($count{$_}) for keys %count;