我正在使用Perl读取制表符分隔文件;并希望将全局替换应用于此文件中的文件路径。我已经读过,我需要将Q和E合并到我的替换命令中;但是我无法让替换工作。我想用ps / bat / csprd替换部分字符串psoft / batch / cs。
$xl[$idx] =~ s/\Qpsoft/batch/cs\E/\Q/psoft/batch/csprd\E/g;
答案 0 :(得分:2)
您无法使用\Q
来转义分隔符。例如,
s/\Qa*b//
相当于
s/a\*b//
而不是
s/a\*b\/\/...
这意味着
$xl[$idx] =~ s/\Qpsoft/batch/cs\E/\Q/psoft/batch/csprd\E/g;
相当于
$xl[$idx] =~ s/psoft/batch/cs <junk>
解决方案:
$xl[$idx] =~ s/psoft\/batch\/cs/\/psoft\/batch\/csprd/g;
更好:
$xl[$idx] =~ s{psoft/batch/cs}{/psoft/batch/csprd}g;
解析m//
,qr//
或s///
运算符需要三个步骤。
第一步是获取影响正则表达式模式解析方式的尾随标志(例如x
,s
,m
,i
等)。由于Perl还不知道如何解析正则表达式模式并降低成本,Perl只是寻找标记模式结束和替换结束的分隔符(通常为/
),注意不反斜杠以外的其他字符(\
)。此时会忽略\Q
。
第二步是双引号字符串转义(例如\Q
,\L
等)并进行插值。在处理这些模式之前,Perl不会有正则表达式模式。
最后,Perl有一个正则表达式模式并知道如何编译它,所以第三步是编译正则表达式模式。
答案 1 :(得分:0)
第一个问题是您需要为替换运算符使用不同的分隔符集。您可以使用s///
代替s{}{}
。另一个问题是,您不应在\Q
的右侧使用\E
和s///
,因为右侧不是正则表达式。在您的情况下,您根本不需要Q / E:
s{psoft/batch/cs}{/psoft/batch/csprd}g;