in reply to Perlmonks Code Proxy

I might be completely off base here, but could you just do something like  $content =~ s!($code_regex)! $1.$href1.$i++.$href2!ge; work? I think its probably cause your substituting stuff into content, making the string different when it tries to do a second match, that was causing it to do strange things. Just a thought - I haven't actually tried it out or anything.

Replies are listed 'Best First'.
(Ovid) RE(2): Perlmonks Code Proxy
by Ovid (Cardinal) on Aug 19, 2000 at 00:46 UTC
    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.

      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;