Just to be perverse, here is exactly what you asked for
print rx_reverse( shift );
sub rx_reverse {
local $_ = shift;
my $length = length;
for my $offset ( 0 .. int($length / 2) ) {
my $rx = rx_gen( $length, $offset );
s/$rx/$1$4$3$2/;
}
$_
}
sub rx_gen {
my $length = shift;
my $offset = shift;
my $skip = $length - 2 * ($offset + 1);
return unless $length > 0 and
$offset <= ($length / 2) and
$skip >= 0;
$offset = $offset ? "((?s:.){$offset})" : '()';
$skip = $skip ? "((?s:.){$skip})" : '()';
return "^$offset((?s:.))$skip((?s:.))"
}