Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw

Re: Regular expression "replace string interpolation" problem

by pc88mxer (Vicar)
on May 16, 2008 at 22:21 UTC ( #687035=note: print w/ replies, xml ) Need Help??

in reply to Regular expression "replace string interpolation" problem

This should work:
... my $replace = '"$1 Perl"'; $text2 =~ s/$match/$replace/ee;
Or you might want to write it like this:
my $replace = '$1 Perl'; # use original setting of $replace $text2 =~ s/$match/'"'.$replace.'"'/ee;
Probably even a better solution would be write $replace as a subroutine:
my $replace = sub { "$1 Perl" }; $text2 =~ s/$match/$replace->()/e;
and then only level of evaluation is needed.

Replies are listed 'Best First'.
Re^2: Regular expression "replace string interpolation" problem
by cLive ;-) (Parson) on May 16, 2008 at 22:25 UTC

    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!!

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

      You want to produce the code
      "$1 \"Perl\""
      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.

      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.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://687035]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (6)
As of 2016-08-28 01:47 GMT
Find Nodes?
    Voting Booth?
    The best thing I ever won in a lottery was:

    Results (390 votes). Check out past polls.