ここにはいくつかの有効な回答があります。この投稿を読みやすくするために、私と一緒に包括的な回答をまとめたいと思います。
根本的な原因
$i = 'D:\Texts1';
正規表現パターンとして使用する場合、「\」はエスケープする必要があります。正規表現エンジンが必要とするのは、D:\\Texts1のような最終的な形式です。したがって、これは機能しませんが、以下に示すように、この形式を構築するには少なくとも 4 つの異なる方法があります。
また、' が一致ステートメントまたは置換ステートメントの区切り文字として使用されている場合、変数補間が無効になり、$filename =~ s'$i'$o'g;がレンダリングされます。ほとんど役に立たない。最初のステップとして、/ または {} を使用するように変更します
解決策 1
quotemetaを使用すると、「\」が効果的にエスケープされます。
$filename = 'D:\Texts1\text1';
$i = quotemeta('D:\Texts1');
$o = 'D:\Texts2';
$filename =~ s/$i/$o/g;
解決策 2
\Q .. \E を使用します。これは quotemeta と同様の効果があります。
$filename = 'D:\Texts1\text1';
$i = 'D:\Texts1';
$o = 'D:\Texts2';
$filename =~ s/\Q$i\E/$o/g; # or s/\Q$i/$o/g also works
解決策 3
文字列内の「\」を明示的にエスケープし、qrを使用して文字列を正規表現パターンとして引用します。
$filename = 'D:\Texts1\text1';
$i = qr 'D:\\Texts1';
$o = 'D:\Texts2';
$filename =~ s/$i/$o/g;
解決策 4
文字列が正規表現の準備ができている範囲でエスケープします。
$filename = 'D:\Texts1\text1';
$i = 'D:\\\\Texts1';
$o = 'D:\Texts2';
$filename =~ s/$i/$o/g;