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