2

Perlスクリプトに次の行があります(cshellから実行します)

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

+ プラス記号で囲まれたすべての単語が削除されることを期待しています。代わりに、以下のエラー メッセージが表示されます。

量指定子は、正規表現では何も続きません。<-- HERE in m/+ <-- HERE [az]++/ at -e line 1.

何が起こっている?バックスラッシュを付けたのに、なぜこのエラーが発生するのでしょうか?

4

2 に答える 2

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 ----+

必要のないときは、シェルコマンドを作成しないでください。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)

これにより、シェルを呼び出してコマンド ラインを再解釈する必要がなくなります。

于 2012-10-08T17:09:20.030 に答える