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

I did try something similar using external anonymous subs but that didn't work. Interesting that it works if the sub is inline.
  • Comment on Re^2: Multiple uses of (?{ code }) do not appear to be called

Replies are listed 'Best First'.
Re^3: Multiple uses of (?{ code }) do not appear to be called
by almut (Canon) on Dec 29, 2006 at 18:09 UTC

    Thing is, if you declare the sub outside of the ?{...} code, that code will bind the first instance of the subroutine. Printing the coderefs shows what's going on:

    sub foo { my $window = "a b X20 c X5 d e X17 X12"; my @o; my $push_o = sub { push @o, @_ }; print "subN=$push_o\n"; my @m = ($window =~ m/(X\d+(?{print "sub1=$push_o\n"; $push_o->(po +s)}))/g); print join(" ", "Matches:", @m, "\n"); print join(" ", "Offsets:", @o, "\n\n"); }

    Output:

    subN=CODE(0x8119060) sub1=CODE(0x8119060) sub1=CODE(0x8119060) sub1=CODE(0x8119060) sub1=CODE(0x8119060) Matches: X20 X5 X17 X12 Offsets: 7 12 20 24 subN=CODE(0x8131ac0) sub1=CODE(0x8119060) sub1=CODE(0x8119060) sub1=CODE(0x8119060) sub1=CODE(0x8119060) Matches: X20 X5 X17 X12 Offsets: subN=CODE(0x8119d50) sub1=CODE(0x8119060) sub1=CODE(0x8119060) sub1=CODE(0x8119060) sub1=CODE(0x8119060) Matches: X20 X5 X17 X12 Offsets:

    Despite three subroutines being created (--> "subN=..."), the one actually being called within ?{...} is always the same, first one (--> "sub1=..."). This sub in turn is bound to the first instance of the variable @o ...