Naja, das liegt daran:
ax -> $1
Dann versucht .*? 0 Zeichen zu matchen (passt)
Dann wird versucht (&c[^&]*)? zu matchen (passt, 0x)
.* matcht den Rest des Strings.
Also kein $2 da.
Noch ein paar Kommentare:
- ein .* am Ende einer Regexp ohne Anker ist überflüssig
- Lösung: du musst anders gruppieren:
echo 'ax&bx&xx&dx' | perl -wnE 'say "$1$2" if /(a[^&]*)(?:.*?(&c[^&]*))?/'
- warum PERL5OPT, perl -wnE tuts doch auch?