Perl one liner在perl脚本中不起作用

时间:2016-07-28 13:08:38

标签: perl

我正在尝试从文件 - 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

不确定如果我错过了一些愚蠢的话,我们非常感激任何投入。提前致谢!

1 个答案:

答案 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;
    }
}