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

Re: matching / splitting within a substitution

by jsprat (Curate)
on Jul 14, 2003 at 23:02 UTC ( [id://274217]=note: print w/replies, xml ) Need Help??


in reply to matching / splitting within a substitution

A quick trip through Deparse shows that perl changes the substitution to this:

$template =~ s[ \[% \s+ IF \s+ (\w+) \s+ %\] # $1 var (.*?) # $2 then \[% \s+ END \s+ %\] ][do { my($a, $b, $c) = ($1, $2, ''); if ($b =~ /[% \s+ ELSE \s+ %]/gsx) { #==============^ ^ backslashes removed! my(@c) = split(/[%\s+ELSE\s+%]/s, $b, 2); #=======================^ ^ backslashes removed! warn 'c(', join('|', @c), ')' if DEBUG; $b = $c[0]; $c = $c[1]; } warn "a($a) b($b) c($c)\n----\n" if DEBUG; defined $$v{$a} && $$v{$a} ? $b : $c; };]egsx;

Note that the backslashes were removed from the regexes! Time for a bug report?

On a hunch, I changed the second set of delimeters from square brackets to curly brackets, the output is as you expected originally.

Update: perl 5.8.0 (ActiveState build 806) on Win2K

Update: The more I think about it, I don't consider this a bug. If you use double-quotes to delimit a string ("\"Hello\""), backwhacking the delimiter results in the double quote as part of the string. The same should hold for square brackets as a delimiter.

Replies are listed 'Best First'.
Re: Re: matching / splitting within a substitution
by PodMaster (Abbot) on Jul 15, 2003 at 01:38 UTC
    Thanks jsprat (and dws -- I should have tried Deparse). I do believe we have a bug, but I got a feeling it's already been reported(will search). Anyway, here is a simpler example that I might submit as a bug report (and I hope this is easy enough to follow BrowserUk).
    ## in the substitution part (the second half), ## the /\[B\]/ is turned into /[B]/, see results ## and deparse output at the end my $t = '[A] yoda [B] jeffa [C]'; $t =~ s { \[A\] (.*?) \[C\] } [ my $r = $1; if( $r =~ /\[B\]/ ){ $r =~ s/\[B\]/GOT B/; } $r; ]gsex; my $o = '[A] yoda [B] jeffa [C]'; $o =~ s { \[A\] (.*?) \[C\] } { my $r = $1; if( $r =~ /\[B\]/ ){ $r =~ s/\[B\]/GOT B/; } $r; }gsex; # happens here also, but is not significant # since <> aren't metacharacters my $p = '<A> yoda <B> jeffa <C>'; $p =~ s { \<A\> (.*?) \<C\> } < my $r = $1; if( $r =~ /\<B\>/ ){ $r =~ s/\<B\>/GOT B/; } $r; >gsex; print " $t $o $p "; __END__ yoda [GOT B] jeffa yoda GOT B jeffa yoda GOT B jeffa # -MO=Deparse output my $t = '[A] yoda [B] jeffa [C]'; $t =~ s[\n \[A\]\n (.*?)\n \[C\]\n ][my $r = $ +1; if ($r =~ /[B]/) { $r =~ s/[B]/GOT B/; } $r;]egsx; my $o = '[A] yoda [B] jeffa [C]'; $o =~ s[\n \[A\]\n (.*?)\n \[C\]\n ][my $r = $ +1; if ($r =~ /\[B\]/) { $r =~ s/\[B\]/GOT B/; } $r;]egsx; my $p = '<A> yoda <B> jeffa <C>'; $p =~ s[\n <A>\n (.*?)\n <C>\n ][my $r = $1; if ($r =~ /<B>/) { $r =~ s/<B>/GOT B/; } $r;]egsx; print "\n$t\n$o\n$p\n";

    MJD says "you can't just make shit up and expect the computer to know what you mean, retardo!"
    I run a Win32 PPM repository for perl 5.6.x and 5.8.x -- I take requests (README).
    ** The third rule of perl club is a statement of fact: pod is sexy.

      A simpler example to report is:

      % perl -MO=Deparse -e "s{\[A\]}[s/\[B\]/C/g]g" s[\[A\]][s/[B]/C/g]g; -e syntax OK
      But I don't consider it a bug. If your delimiters are [] then \[ becomes [. If you want \[ then you'll need \\\[ (or \\[ also works if the square brackets balance).

      So, inside qq[], [] and \[\] are the same. Much like "\g" and "g" are the same or '\g' and '\\g' are the same.

                      - tye
        Ok, I think you have a point, so what I think now is that the pod needs to be enhanced to mention this. Thanks.
        C:\>perl -MO=Deparse -e" s{\[A\]}'s/\[B\]/C/g'g" s[\[A\]][s/\\[B\\]/C/g]g; -e syntax OK

        MJD says "you can't just make shit up and expect the computer to know what you mean, retardo!"
        I run a Win32 PPM repository for perl 5.6.x and 5.8.x -- I take requests (README).
        ** The third rule of perl club is a statement of fact: pod is sexy.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others lurking in the Monastery: (6)
As of 2024-04-18 13:09 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found