这里有几个有效的答案,我想和我一起编译一个全面的答案,以使这篇文章更容易阅读:
根本原因
$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;