%hash = (); foreach $_ (@array) { $hash{getkey($_)} = $_; } #### my %res = map { $_ => do { my $re; $re .= $translations{$_} for split //; $re; } if !$res{$_}; } @words; #### my %res; foreach my $word (@rw) { $res{$word} ||= do { my $re; $re .= $translations{$_} for split //,$word; $re; } } #### Benchmark: running foreach, map_it for at least 5 CPU seconds... foreach: 6 wallclock secs ( 5.34 usr + 0.00 sys = 5.34 CPU) @ 286.87/s (n=1531) map_it: 5 wallclock secs ( 5.15 usr + 0.01 sys = 5.16 CPU) @ 134.77/s (n=695) #### my @b = (7,5,5,6); my @a; @a = map { $_ > 5 ? $_ : $a[0] } @b;