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


in reply to Re: Regular expression "replace string interpolation" problem
in thread Regular expression "replace string interpolation" problem

That works - thanks :)

But, reading through the regex documentation, I still can't work out exactly why. Hmmm.

so I guess needs to be \\" in the replace string for quotes. Arghhh, double escaping!!

  • Comment on Re^2: Regular expression "replace string interpolation" problem

Replies are listed 'Best First'.
Re^3: Regular expression "replace string interpolation" problem
by ikegami (Patriarch) on May 16, 2008 at 22:39 UTC

    Or how to embed " in the output - but that's not a biggie right now.

    You want to produce the code
    "$1 \"Perl\""
    so
    my $replace = '"$1 \\"Perl\\""'; # Produces: "$1 \"Perl\"" s/$match/eval $replace/e

    Technically, the slashes don't need to be doubled since single quotes are forgiving when it's unambiguous.

Re^3: Regular expression "replace string interpolation" problem
by pc88mxer (Vicar) on May 17, 2008 at 06:36 UTC
    To explain what's going on it might be helpful to use underlined bold text to represent strings. So, one can write:
    eval 2+24
    and this means if you eval the string 2+2, you'll get the string 4. In perl this is just:
    my $x = '2+2'; my $y = eval $x; # $y is the string '4'

    In your original example, what is happening during the substitution s/$match/$replace/e is:

    eval $replace$1 Perl
    I.e., the match is replaced with the string $1 Perl, and that is why $text2 contains $1 Perl world.

    How about just adding another /e modifier to evaluate the substitution again? Unfortunately this doesn't work because $1 Perl world is not valid perl syntax:

    eval eval $replaceeval $1 Perl worldsyntax error

    When $replace and the substitution is written as:

    my $replace = '"$1 Perl"'; $text2 =~ s/$match/$replace/ee;
    the evaluation of the replacement proceeds as follows:
    eval eval $replaceeval "$1 Perl"
    and because of the double quotes this last eval yields $1 concatenated with a space and the string Perl.