in reply to (${code}) Regex - Iteration

It starts matching at pos 0 and succeeds
It starts matching at pos 0 and fails
It starts matching at pos 1 and succeeds
It starts matching at pos 1 and fails
It starts matching at pos 2 and succeeds
It starts matching at pos 2 and fails
..
It starts matching at pos 20 and succeeds
It starts matching at pos 20 and fails

It fails because the match would be identical (same start pos and length) as the previous match. Since it only fails *after* processing the (?{code}), it prints (X+1)*2 times.

What did you want it to do? The following matches X times.

s/.(?{ print ++$x,"\n" })//g

Update: Fixed regex. It had an extra . in it.