in reply to Re^2: Multiple uses of (?{ code }) do not appear to be called
in thread Multiple uses of (?{ code }) do not appear to be called

Ha ha, looks like you and I were on the same path. I think I'll avoid using the bug though it is useful to know.
  • Comment on Re^3: Multiple uses of (?{ code }) do not appear to be called

Replies are listed 'Best First'.
Re^4: Multiple uses of (?{ code }) do not appear to be called
by rhesa (Vicar) on Dec 29, 2006 at 14:41 UTC
    Glad you're going to avoid that "feature" :-) (see e.g. Re: static-like persistence of my variable due to trailing conditional and How does my work with a trailing conditional for previous discussions)

    I'd like to give you two reasonable workarounds. The first is simply using the global variable, with my added suggestion to enclose it in an anonymous block:

    { # limit scope my @o; sub foo { my $window = "a b X20 c X5 d e X17 X12"; @o = (); my @m = ( $window =~ m/(X\d+(?{push @o, pos()}))/g ); print "Matches: @m"; print "Offsets: @o"; print " "; } }
    This will make sure that only foo() can see @o.

    The second workaround is basically a rewrite of your code. It doesn't solve the general issue, but it avoids the use of the complicated (?{BLOCK}) feature for your particular case:

    sub foo { my $window = "a b X20 c X5 d e X17 X12"; my( @o, @m ); while( $window =~ m/(X\d+)/g ) { push @m, $1; push @o, $+[0]; } print "Matches: @m"; print "Offsets: @o"; print " "; }
      Thanks for the further suggestions. It seems blazar has given a better solution in using "local our" modifiers to avoid declaring a global variable.

      Your code will break if execution ever proceeds past the my(@o) line. That is, if you put a foo() call at the end of your script. It is always bad style to use my() variables with (?{...}) and (??{...}). Don't do it.

      ⠤⠤ ⠙⠊⠕⠞⠁⠇⠑⠧⠊

        I'll gladly accept your advice about it being bad style, but I don't understand why you say my code would break. Given that the following works, I must be overlooking something:
        #!/usr/bin/perl -l use strict; bar(); bar(); { # limit scope my @o; sub bar { my $window = "a b X20 c X5 d e X17 X12"; @o = (); my @m = ( $window =~ m/(X\d+(?{push @o, pos()}))/g ); print "Matches: @m"; print "Offsets: @o"; print " "; } } print "One last time"; bar(); __END__ Matches: X20 X5 X17 X12 Offsets: 7 12 20 24 Matches: X20 X5 X17 X12 Offsets: 7 12 20 24 One last time Matches: X20 X5 X17 X12 Offsets: 7 12 20 24
        Even if I put the bar() call inside the bare block, right after the sub definition, it still works. I'd appreciate it if you could enlighten me.