Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl one liner在Perl脚本中不起作用_Perl - Fatal编程技术网

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

Perl one liner在Perl脚本中不起作用,perl,Perl,我正试图使用perl脚本中的一行代码从文件-list.txt中删除字符串@my.mail.com。 (Perl脚本从windows server启动) 以下是我在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")

我正试图使用perl脚本中的一行代码从文件-list.txt中删除字符串@my.mail.com。 (Perl脚本从windows server启动)

以下是我在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

不确定我是否遗漏了一些愚蠢的东西,任何意见都非常感谢。提前谢谢

这里有两个问题。首先,您在文件路径中转义了反斜杠,但在正则表达式模式中没有转义,其次,您在
-e
选项的参数周围使用了单引号,Windows不会将其识别为分隔符

这种变化应该适合你。它使用单引号(实际上是
q{…}
)来保护反斜杠,因此不需要转义任何内容

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;
    }
}
{
local@ARGV='D:\myfolder\list.txt';
本地$^I='.bak';
而(){
s/\s+\@my\.mail\.com\s+//g;
印刷品;
}
}

这里有两个问题。首先,您在文件路径中转义了反斜杠,但在正则表达式模式中没有转义,其次,您在
-e
选项的参数周围使用了单引号,Windows不会将其识别为分隔符

这种变化应该适合你。它使用单引号(实际上是
q{…}
)来保护反斜杠,因此不需要转义任何内容

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;
    }
}
{
local@ARGV='D:\myfolder\list.txt';
本地$^I='.bak';
而(){
s/\s+\@my\.mail\.com\s+//g;
印刷品;
}
}

我可以建议:不要。只需编写一些perl,不要使用perl在第二个和第三个示例中使用“mgd”而不是“my”。此外,我认为您可能需要在第一个和第二个示例中使用
\\\\@my
,因为使用了双插值(反勾号/引号和
s///
)@Markus Laire:对不起,编辑了这个问题。键入如果您的文件需要简单的操作,您可以使用像vim这样的文本编辑器来执行此类操作。我建议您不要这样做。只需编写一些perl,不要使用perl在第二个和第三个示例中使用“mgd”而不是“my”。此外,我认为您可能需要在第一个和第二个示例中使用
\\\\@my
,因为使用了双插值(反勾号/引号和
s///
)@Markus Laire:对不起,编辑了这个问题。键入如果您的文件需要简单的操作,您可以使用vim之类的文本编辑器来执行此类操作。非常好,谢谢。以及最佳实践建议!太好了,非常感谢。以及最佳实践建议!