http://qs321.pair.com?node_id=73644


in reply to Quickie Question: search and replace problem

Basically, $data is intepreted as a string, and $attempt1 as a regex, so if you have special regex characters, they will never match up, no matter how you escape them.

To make a regex treat $attempt1 as a string, use \Q and \E:
$data =~ s/\Q$attempt1\E/$newstr/
man perlre for more info.

Updated: Added rant, as per tye :)

Replies are listed 'Best First'.
(tye)Re: Quickie Question: search and replace problem
by tye (Sage) on Apr 19, 2001 at 00:58 UTC

    I've created a monster! ;)

    Actually, you can eventually quote them enough to get the same effect as \Q and \E. I personally like the /\Q$string\E/ construct and recommend it over the other methods I'm about to mention.

    But you can also do any of these:

    $attempt= "get_stuff\\(\\)"; $attempt= "\Qget_stuff()\E"; $attempt= quotemeta( "get_stuff()" ); $attempt= qr/get_stuff\(\)/; $attempt= 'get_stuff\(\)';
    but I still find the original suggestion makes the most sense to me. In a regex (that means only the first half of s///), $x means interpret the contents of $x as a regex while \Q$x\E means interpret the contents of $x as a string.

    Update: Thanks, indigo, I missed that!

            - tye (but my friends call me "Tye")
      All these do the escaping properly. But the code went like this:
      $data = $attempt; $data =~ s/$attempt/$newstr/;
      The problem isn't simply bad escaping. Either $attempt gets munged, and the match fails, or you have to premunge $data to get $attempt right, and the match still fails.

      So /\Q$attempt\E/ really is the best way to go.
Re: Re: Quickie Question: search and replace problem
by JojoLinkyBob (Scribe) on Apr 19, 2001 at 00:55 UTC
    Thanks! Desert coder