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

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 ...