Perl正規表現の罠と罠はずし

改行文字を含む文字列をマッチング対象とし、改行文字もただの文字として扱う場合、オプションにsを付けるが、行頭アンカー(^)を付けた文字列をマッチングパターンにすると、うまくマッチングしない不具合が起こる。
そこで、行頭アンカーを"(?:(?:^)|(?<=[\n]))"に置き換えるとうまく行く。意味は、「文字列の先頭、または前の文字が改行文字の場合」となる。

my $text = "12345\nABCDEFG\n12345\n";
print $text;  # 変換前
$text =~ s/^ABCDE/x/gs;  # この変換は失敗
print '-' x 20 . "\n";
print $text;  # 変換後(変わらない)
$text =~ s/(?:(?:^)|(?<=[\n]))ABCDE/abcde/gs;  # この変換は成功
print '-' x 20 . "\n";
print $text;  # 変換後(キチンと置き換わった)
12345
ABCDEFG
12345
                                      • -
12345 ABCDEFG 12345
                                      • -
12345 abcdeFG 12345