http://www.perlmonks.org?node_id=1199222


in reply to Re: string replacement
in thread string replacement

my $pattern = join "|", map quotemeta, keys %replacements;

I think it would be good to also sort on length, as I discussed in Building Regex Alternations Dynamically. Although huck does make a good point that preserving the original ordering may be important too. Update after your reply: Good point about replacements within the replacements, whether the OP wants that or not and which method is more appropriate will depend on their requirements.

Replies are listed 'Best First'.
Re^3: string replacement
by Eily (Monsignor) on Sep 12, 2017 at 20:44 UTC

    You're right about putting the longest strings first, if one searched string can be the start of another. That would be my $pattern = join "|", map quotemeta, sort {length $b <=> length $a} keys %replacements;.

    With a single substitution operator you don't have to look for the presence of a searched string inside a replacement, because perl will only keep searching after the replaced item, so you can't replace part of a replacement.