Perl全局替换文件路径

时间:2017-01-24 20:26:33

标签: perl file path substitution

我正在使用Perl读取制表符分隔文件;并希望将全局替换应用于此文件中的文件路径。我已经读过,我需要将Q和E合并到我的替换命令中;但是我无法让替换工作。我想用ps / bat / csprd替换部分字符串psoft / batch / cs。

$xl[$idx] =~ s/\Qpsoft/batch/cs\E/\Q/psoft/batch/csprd\E/g;  

2 个答案:

答案 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///运算符需要三个步骤。

第一步是获取影响正则表达式模式解析方式的尾随标志(例如xsmi等)。由于Perl还不知道如何解析正则表达式模式并降低成本,Perl只是寻找标记模式结束和替换结束的分隔符(通常为/),注意不反斜杠以外的其他字符(\)。此时会忽略\Q

第二步是双引号字符串转义(例如\Q\L等)并进行插值。在处理这些模式之前,Perl不会有正则表达式模式。

最后,Perl有一个正则表达式模式并知道如何编译它,所以第三步是编译正则表达式模式。

答案 1 :(得分:0)

第一个问题是您需要为替换运算符使用不同的分隔符集。您可以使用s///代替s{}{}。另一个问题是,您不应在\Q的右侧使用\Es///,因为右侧不是正则表达式。在您的情况下,您根本不需要Q / E:

s{psoft/batch/cs}{/psoft/batch/csprd}g;

请参阅s/PATTERN/REPLACEMENT/