http://qs1969.pair.com?node_id=11148255


in reply to Global match and capture group in look-ahead == under-populated "@-"?

Is this a bug?

The regexp debugger shows that in the /g case, the last match in the "implicit loop" of /g is a failed one (see also Repeated Patterns Matching a Zero length Substring), probably leading to that result in @-; note that $+ and $^N are also undef in this case. In addition to the below, try perl -MRegexp::Debugger -e '$_="a";s/(?=(a))/b/g'.

However, using those variables after a /g match feels a little sketchy to me, so this may be an XY problem, so if you could explain the bigger picture, perhaps we can help solve that.

$ perl -Mre=debug -e '$_="a";s/(?=(a))/b/g' Compiling REx "(?=(a))" Final program: 1: IFMATCH[0] (11) 3: OPEN1 (5) 5: EXACT <a> (7) 7: CLOSE1 (9) 9: SUCCEED (0) 10: TAIL (11) 11: END (0) minlen 0 Matching REx "(?=(a))" against "a" 0 <> <a> | 0| 1:IFMATCH[0](11) 0 <> <a> | 1| 3:OPEN1(5) 0 <> <a> | 1| 5:EXACT <a>(7) 1 <a> <> | 1| 7:CLOSE1(9) 1 <a> <> | 1| 9:SUCCEED(0) | 1| SUCCEED: subpattern success... 0 <> <a> | 0| 11:END(0) Match successful! Matching REx "(?=(a))" against "a" 0 <> <a> | 0| 1:IFMATCH[0](11) 0 <> <a> | 1| 3:OPEN1(5) 0 <> <a> | 1| 5:EXACT <a>(7) 1 <a> <> | 1| 7:CLOSE1(9) 1 <a> <> | 1| 9:SUCCEED(0) | 1| SUCCEED: subpattern success... 0 <> <a> | 0| 11:END(0) END: Match possible, but length=0 is smaller than requested=1, failing +! 1 <a> <> | 0| 1:IFMATCH[0](11) 1 <a> <> | 1| 3:OPEN1(5) 1 <a> <> | 1| 5:EXACT <a>(7) | 1| failed... | 0| failed... Match failed Freeing REx: "(?=(a))"