in reply to Re: Replace only unescaped metachars
in thread Replace only unescaped metachars

Ah, yes, this is the clever part I was missing:
(?<!\\) ((?:\\{2})*)
It makes sure that only unescaped metachars are converted (all preceding escapes are even).
Thanks!

But why is the following an optimization (against my code)?:
for ($string) { $result .= $1 if /\G ([^\\*?]+) /xgcs; /\G \\(.) /xgcs && do { $result .= $1; redo; }; /\G \* /xgcs && do { $result .= '?'; redo; }; /\G \? /xgcs && do { $result .= '#'; redo; }; }
If I see it right, both versions try to keep the common case at the beginning and have to walk through the other regexes until the first match. (Besides the 'redo' irritated me until I read in the docs that it doesn't redo do-blocks) But still thank you very much for this too, it is always good to have variations at hand.
-Michael

Replies are listed 'Best First'.
Re^3: Replace only unescaped metachars
by ikegami (Patriarch) on Feb 23, 2007 at 17:42 UTC

    But why is the following an optimization (against my code)?:

    It's an optimization against *my* code. You had a similar optimization already. (Your first elsif would have to be an if to be the same.)

    Besides the 'redo' irritated me until I read in the docs that it doesn't redo do-blocks

    redo, last and next only work on the various for/foreach blocks, while blocks and bare blocks. They don't work on non-loop blocks such as if, do, eval and sub blocks.