Phoinix
Для 20 элементов наверное нет особой разницы, как делать. Просто твой алгоритм крадратичный, а мой линейный. И зачем уходить от foreach не понятно.
NeoNox
Этот код работает немного не так, как исходный:
my @arr1 = (\'1\',\'2\',\'2\',\'4\',\'5\');
my @arr2 = (\'6\',\'1\',\'7\',\'5\',\'8\');
map { push (@m , $_) if $_{$_} > 1} grep{!$_{$_}++} @arr1, @arr2;
print $#m+1;
выдает "3", а исходный выдал бы "2".