Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re: matching / splitting within a substitution

by jsprat (Curate)
on Jul 14, 2003 at 23:02 UTC ( #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.


Comment on Re: matching / splitting within a substitution
Download Code
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
Node Status?
node history
Node Type: note [id://274217]
help
Chatterbox?
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: (9)
As of 2015-07-29 01:03 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (260 votes), past polls