in reply to Re: Problem with Pattern matching and substitution using variables
in thread Problem with Pattern matching and substitution using variables

Why is the second /e switch needed to properly eval the replace pattern? In trying it out, I see it clearly is, but I'm missing something here in trying to reason it out. I'm confused as to why a single /e and no switch produce the same result.

Replies are listed 'Best First'.
Re^3: Problem with Pattern matching and substitution using variables
by kennethk (Abbot) on Sep 09, 2011 at 19:34 UTC
    As documented in s/PATTERN/REPLACEMENT/msixpodualgcer in perlop:
    Otherwise, if the PATTERN contains a $ that looks like a variable rather than an end-of-string test, the variable will be interpolated into the pattern at run-time.
    ...
    e Evaluate the right side as an expression.
    ee Evaluate the right side as a string then eval the result.
    Essentially, with no switch, the variable is interpolated following qq rules. With one e, the value between the slashes is evaluated; all that lies between the slashes is the scalar, so it evaluates equivalently. With two es, the scalar is evaluated into the string value, and then that string value is passed through eval.

      Thank you. That solved the issue. Following is the code i am using.

      my $data = '#define MANUFACTURER "xyz"'; my $replace = '#define MANUFACTURER(\s+)"xyz"'; my $replace_with = '#define MANUFACTURER$1"abcd"'; my $tmp_str = '$data =~ s/$replace/'.$replace_with.'/g'; eval $tmp_str; print "\n",$data;

      Note: The code takes the same approach as kennethk suggested, except that i didn't want the extra qoutes (and escaping of quotes) in $replace_with variable.