2

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

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

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

量词不遵循正则表达式;由 <-- HERE in m/+ <-- HERE [az]++/ 在 -e 第 1 行标记。

怎么了?我给了反斜杠,为什么会出现这个错误?

4

2 回答 2

5

假设$file1contains -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;
    }
}
于 2012-10-08T17:15:41.067 回答
2

尝试使用多参数版本system

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

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

于 2012-10-08T17:09:20.030 回答