$string =~ s/(a|b)/$map{ $1 }/g; #### $pattern = join '|', map quotemeta, keys %map; $string =~ s/($pattern)/$map{ $1 }/go; # /o only if the pattern never changes #### use Regex::PreSuf; my $pattern= presuf(keys %map); $string =~ s/($pattern)/$map{ $1 }/go; #### $pattern = join '|', map quotemeta, sort { length($b) <=> length($a) } keys %map; #### $pattern = join '|', map quotemeta, sort { $b cmp $a } keys %map;