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

文字列を複数行として扱う修飾子「m」を付けると、改行文字による行区切りの後を行頭、前を行末と見なすので、行頭・行末アンカーを置き換えなくてもそのまま使える。

$text = "12345\nABCDEFG\n12345\n";
print '=' x 10 . '(1-0)' . '=' x 10 . "\n";
print $text;
$text =~ s/^ABCDE/x/gm;
print '=' x 10 . '(1-1)' . '=' x 10 . "\n";
print $text;

$text = "12345\nABCDEFG\n12345\n";
print '=' x 10 . '(2-0)' . '=' x 10 . "\n";
print $text;
$text =~ s/^1234/6789/gm;
print '=' x 10 . '(2-1)' . '=' x 10 . "\n";
print $text;

$text = "12345\nABCDEFG\n12345\n";
print '=' x 10 . '(3-0)' . '=' x 10 . "\n";
print $text;
$text =~ s/EFG$/x/gm;
print '=' x 10 . '(3-1)' . '=' x 10 . "\n";
print $text;

$text = "12345\nABCDEFG\n12345\n";
print '=' x 10 . '(4-0)' . '=' x 10 . "\n";
print $text;
$text =~ s/2345$/7890/gm;
print '=' x 10 . '(4-1)' . '=' x 10 . "\n";
print $text;

実行結果

==========(1-0)==========
12345
ABCDEFG
12345
==========(1-1)==========
12345
xFG
12345
==========(2-0)==========
12345
ABCDEFG
12345
==========(2-1)==========
67895
ABCDEFG
67895
==========(3-0)==========
12345
ABCDEFG
12345
==========(3-1)==========
12345
ABCDx
12345
==========(4-0)==========
12345
ABCDEFG
12345
==========(4-1)==========
17890
ABCDEFG
17890

改行が含まれていて、行頭・行末の認識が必要なら、最初からこっちを使ったほうがいいかも。