I don't really grok the look-around assertion
Think of it as a subroutine call. The engine tries to match the sub pattern at the current location, but it current location doesn't change.
+------------ Matched at pos 0.
| +-------- Matched at pos 1.
| |+------- Matched at pos 2.
| || +----- Matched at pos 1.
| || |+---- Matched at pos 2.
| || ||+--- Matched at pos 3.
| || |||
v vv vvv
'abcd' =~ /a(?!BC)..d/ # Matches
Since the position on the outer regex isn't affected, replacements don't take what the sub expression matched into consideration.
my $s = 'abcd';
$s =~ s/a(?=bc)/x/; # xbcd
my $s = 'aefg';
$s =~ s/a(?=bc)/x/; # abcd
The substitution pattern in your version has one less \05. Is that intentional?
Yes. One less \05 is being replaced, so one less \05 should be added.
I'm not familiar enough with this code or its expected output to really tell when it's working or when I might introduce a subtle bug somewhere
Then I guess the next order of business is to figure out the code and write test cases.