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->(pos)}))/g); print join(" ", "Matches:", @m, "\n"); print join(" ", "Offsets:", @o, "\n\n"); } #### 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: