my %subst = ( '&' => 'amp', '>' => 'gt', '<' => 'lt' ); my $alternatives = join('|', map quotemeta, sort { length($b) <=> length($a) || $b cmp $a } keys %subst); $string =~ s/($alternatives)/$subst{$1}/ge;