I think an s///e approach like Tux's s_ger() here is probably best for readability/maintainability, but just for grins, here's a "pure" regex approach:
Win8 Strawberry 5.8.9.5 (32) Sun 06/05/2022 5:38:06
C:\@Work\Perl\monks
>perl
use strict;
use warnings;
my $s = 'AAAAAXXXXXXXAAAXXXXXAXXXXAAAA';
print "'$s' \n";
$s =~ s{ (?: \G (?! \A) | (?<= A)) X (?= X* A) }{a}xmsg;
print "'$s' \n";
^Z
'AAAAAXXXXXXXAAAXXXXXAXXXXAAAA'
'AAAAAaaaaaaaAAAaaaaaAaaaaAAAA'
Please see perlre, perlretut, perlreref, and perlrequick.
Update: And a shameless elaboration:
Win8 Strawberry 5.8.9.5 (32) Sun 06/05/2022 6:52:29
C:\@Work\Perl\monks
>perl
use strict;
use warnings;
my %replace = map { 'X' x $_ => 'a' x $_ } 1, 3, 7;
my ($rx_search) =
map qr{ $_ }xms,
join ' | ',
map quotemeta,
reverse sort
keys %replace
;
# print "\$rx_search $rx_search \n"; # for debug
for my $s (
'AAAAAXXXXXXXAAAXXXXXAXXXXAAAA',
'XXXXXXXAAAXXXXXAXXXX', 'AXA',
'XXXXXXXXXXX', 'AAAAAAAAAAA', 'XA', 'AX', 'X', 'A', '',
) {
print "'$s' \n";
(my $t = $s) =~ s{ (?: \G (?! \A) | (?<= A)) ($rx_search) (?= X* A
+) }
{$replace{$1}}xmsg;
print "'$t' \n\n";
}
^Z
'AAAAAXXXXXXXAAAXXXXXAXXXXAAAA'
'AAAAAaaaaaaaAAAaaaaaAaaaaAAAA'
'XXXXXXXAAAXXXXXAXXXX'
'XXXXXXXAAAaaaaaAXXXX'
'AXA'
'AaA'
'XXXXXXXXXXX'
'XXXXXXXXXXX'
'AAAAAAAAAAA'
'AAAAAAAAAAA'
'XA'
'XA'
'AX'
'AX'
'X'
'X'
'A'
'A'
''
''
Give a man a fish: <%-{-{-{-<
|