我正在尝试从文件 - list.txt中删除字符串 @ my.mail.com ,使用我的perl脚本中的一个衬垫。 (Perl脚本从Windows服务器启动)
r12355 test@my.mail.com
r29555 test@my.mail.com
r29555 trial@my.mail.com
@my.mail.com
r295721 xxx@my.mail.com
r295722 yyyy@my.mail.com
@my.mail.com
r295140 test@my.mail.com
r295145 test@my.mail.com
@my.mail.com
以下是我在perl脚本中调用时尝试的选项:
`perl -pi.bak -e 's/\s+\@my\.mail\.com\s+//g;' D:\\myfolder\\list.txt`;
system("perl -pi.bak -e 's/\s+\@my\.mail\.com\s+//g;' D:\\myfolder\\list.txt");
system( q( perl -l -pi.bak -e 's/\s+\@my\.mail\.com\s+//g;' D:\\myfolder\\list.txt ) );
我期待像
这样的结果r12355 test@my.mail.com
r29555 test@my.mail.com
r29555 trial@my.mail.com
r295721 xxx@my.mail.com
r295722 yyyy@my.mail.com
r295140 test@my.mail.com
r295145 test@my.mail.com
不确定如果我错过了一些愚蠢的话,我们非常感激任何投入。提前致谢!
答案 0 :(得分:3)
这里有两个问题。首先,您已经转义了文件路径中的反斜杠,但没有转义为正则表达式模式,其次,您在参数周围使用了单引号-e
选项,Windows无法将其识别为分隔符
此变体应该适合您。它使用单引号(实际为q{...}
)来保护反斜杠,以便 nothing 需要转义
system q{perl -pi.bak -e "s/\s+\@my\.mail\.com\s+//g" D:\myfolder\list.txt};
但是,从Perl程序中转出另一个perl进程是不好的做法。它可以通过添加它直接在主代码中完成,它更易读,更容易出错
{
local @ARGV = 'D:\myfolder\list.txt';
local $^I = '.bak';
while ( <> ) {
s/\s+\@my\.mail\.com\s+//g;
print;
}
}