perl脚本中的perl内联编辑

时间:2012-10-08 17:03:27

标签: perl

我的perl脚本中有以下行(我从cshell运行)

system("perl -p -i -e 's/\+[a-z]+\+//g' $file1");

我希望它删除所有被+加号包围的单词。相反,我收到以下错误消息。

  

量词在正则表达式中没有任何关系;标记为< - HERE,m / +< - HERE [a-z] ++ / at -e line.1。

发生了什么事?我给了反斜杠,为什么然后出现这个错误?

2 个答案:

答案 0 :(得分:5)

我们说$file1包含-foo bar.txt,字符串文字

"perl -p -i -e 's/\+[a-z]+\+//g' $file1"

生成字符串

perl -p -i -e 's/+[a-z]++//g' -foo bar.txt
                 ^      ^     ^   ^
                 |      |     |   |
                 +---- errors ----+

不需要时,不要创建shell命令。只需直接启动perl

system("perl", "-p", "-i", "-e", 's/\+[a-z]+\+//g', '--', $file1)

但为什么要创建一个新流程呢?您可以使用以下内容完成相同的操作!

{
    local @ARGV = $file1;
    local $^I = '';
    while (<>) {
        s/\+[a-z]+\+//g;
        print;
    }
}

或作为子:

sub fixer {
    my $pat = shift;
    local @ARGV = @_;
    local $^I = '';
    while (<>) {
        s/$pat//g;
        print;
    }
}

答案 1 :(得分:2)

尝试使用system的多参数版本:

system("perl", "-p", "-i", "-e", 's/\+[a-z]+\+//g', $file1)

这可以避免调用shell并让它重新解释命令行。