2016-07-28 20 views
0

私のperlスクリプトの1つのライナーを使用して、文字列@ my.mail.comをファイル-list.txtから削除しようとしています。Perlの1つのライナーがperlスクリプト内で動作していません

r12355 [email protected] 
r29555 [email protected] 
r29555 [email protected] 
r295721 [email protected] 
r295722 [email protected] 
r295140 [email protected] 
r295145 [email protected] 
ような結果

`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 [email protected] 
r29555 [email protected] 
r29555 [email protected] 
    @my.mail.com 
r295721 [email protected] 
r295722 [email protected] 
    @my.mail.com 
r295140 [email protected] 
r295145 [email protected] 
    @my.mail.com 

は、以下のperlスクリプト内で呼び出している間、私がしようとしているオプションです(Perlスクリプトは、Windows Serverからキックオフされます)

わからない何か愚かなことが見つからない場合、入力は本当に感謝しています。前もって感謝します!

+3

私は次のことを提案できます。いくつかのperlを書いて、perlをperlで起動しないでください – Sobrique

+0

2番目と3番目の例は "my"の代わりに "mgd"を持っています。また、二重補間(backticks/quotesと 's ///')のため、第1と第2の例で '\\\ @ my'を使う必要があると思います。 –

+0

@ Markus Laire:質問を編集しました.YP – Goku

答えて

3

ここには2つの問題があります。まず、ファイルパスのバックスラッシュをエスケープして正規表現パターンでエスケープした後、-eオプションのパラメータの前後に単一引用符を使用しましたが、Windowsでは区切り文字として認識されません。

このバリエーションはうまくいくはずです。

system q{perl -pi.bak -e "s/\s+\@my\.mail\.com\s+//g" D:\myfolder\list.txt}; 

をエスケープする必要があります何があなたのPerlプログラム内から別のperlプロセスに殻から取り出すために貧しい人々の練習をされていないしかし、そのように、それは、バックスラッシュを保護するために、単一引用符(実際q{...})を使用しています。あなたのメインコードでこれを追加することで直接行うことができます。これははるかに読みやすく、間違っても簡単ではありません。

{ 
    local @ARGV = 'D:\myfolder\list.txt'; 
    local $^I = '.bak'; 

    while (<>) { 
     s/\s+\@my\.mail\.com\s+//g; 
     print; 
    } 
} 
+0

パーフェクト、ありがとう。ベストプラクティスの提案をしてください! – Goku

関連する問題