in reply to Re: Perlmonks Code Proxy
in thread Perlmonks Code Proxy

I tried something like s///ge at one point, but it doesn't work in this case. The /e causes the right hand side of s/// to be handled as code to eval. Well, since we are deliberately matching Perl code with this regex, this solution tends to choke quite spectacularly.

I think its probably cause your substituting stuff into content, making the string different when it tries to do a second match...

Oh!!!!! Good point. Didn't think Perl would bomb on that. Need to go check it out. Thanks.

Cheers,
Ovid

Update: Oops. Just noticed that tye pointed out the same problem and I've verified that it's the bug. Here's a bit of sample code that can reproduce it (don't do this at home, kids):

#!/usr/bin/perl $string = "1"; # Infinite loop caused by modifying the string we are matching against + in while statement while ($string =~ /(\d)/g) { $match = $1; $string =~ s/$match/$match/; } print $string;

Update 2: After reading through Boogman and tilly's comments below, I'll have to see what I can do to reproduce the /e error. It was rather frustrating.

Replies are listed 'Best First'.
RE: RE: Re: Perlmonks Code Proxy
by Boogman (Scribe) on Aug 19, 2000 at 01:24 UTC
    The /e causes the right hand side of s/// to be handled as code to eval. Well, since we are deliberately matching Perl code with this regex, this solution tends to choke quite spectacularly.
    Hmmm... Thats strange. I decided to fool around with it and tried this out:
    my $i = 1; my $string = 'print "hello";'; my $content = 'print "hello";$x + 2; print "hello";print "hello";print + "hello";'; $content =~ s/($string)/$1.$i++."\n"/ge; print "$content\n"; eval $string;
    and it printed out
    print "hello";1 $x + 2; print "hello";2 print "hello";3 print "hello";4 hello
    It doesn't seem that it executed the print statement that was matched, even though if we hand the string directly to exec, it does print out hello.
      Right hand side, not left:
      $str = "Hello world\n"; $str =~ s/o/print "Got an o!\n"/eg; print $str;
        yeah - I was saying that if you matched code on the right side, and then used that code in the eval expression with $1, it wouldnot get executed.

        AKA, saying s/(stuff)/$1/eg would not do anything even if the stuff captured in $1 was perl code.

        $string = "print 'got an o\n'"; $string =~ s/(.*)/$1/eg;
        Doesn't print anything.