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


in reply to string replacement

Please edit your post to correct the formatting. See Markup in the Monastery. You should at least use <code> tags around your config file so that it can be displayed properly.

The "search and replace from a list of replacements" part can be done using a hash, and the substitution operator.

use strict; use warnings; my $text = "I will not stir from this place, do what they can."; my %replacements = ( "will not" => "won't", "stir" => "move", "this place" => "here", "do what they can" => "let them try"); my $pattern = join "|", map quotemeta, keys %replacements; print "The pattern is: $pattern\n"; my $replaced = $text =~ s/($pattern)/$replacements{$1}/gr; print $replaced;
The pattern part is a regular expression if you don't know about them you can look at those tutorials.
The quotemeta escapes the special characters in the search items so that they are interpreted litteraly in the regular expression.
The s/search/replace/ part is what does the actual job, the search part will capture the strings it finds (because of the parenthesis) into $1, and $replacements{$1} will return the matching replacement. The g in /gr means "general", and will apply the change everywhere in the string, not just once, and the r means "return", so the result is returned to $replaced, instead of changing $text itself.

As for reading your config file, one of the config modules might do what you want.

Replies are listed 'Best First'.
Re^2: string replacement
by haukex (Archbishop) on Sep 12, 2017 at 18:57 UTC
    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.

      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.

Re^2: string replacement
by colox (Sexton) on Sep 13, 2017 at 16:06 UTC
    thanks you so much for the inputs!...