2016-07-28 59 views
0

我試圖從文件列表中刪除字符串@ my.mail.com使用從我的Perl腳本中的一個班輪。 (Perl腳本是從Windows Server拉開序幕)Perl的一個班輪是不是在Perl腳本內工作

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 -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] 
r295721 [email protected] 
r295722 [email protected] 
r295140 [email protected] 
r295145 [email protected] 

不知道如果我錯過了一些愚蠢的東西,任何投入都非常感激。提前致謝!

+3

我可以建議:不可以。只要寫一些perl,並且不要使用perl來啓動perl – Sobrique

+0

第二和第三個例子有「mgd」而不是「my」。另外我認爲你可能需要在第一和第二個例子中使用'\\\ @ my',因爲雙重插值(反引號/引號和'///') –

+0

@Markus Laire:對不起,編輯了這個問題.TYPO – Goku

回答

3

這裏有兩個問題。首先,您已經在文件路徑中跳過了反斜槓,但沒有使用正則表達式格式;其次,您使用了參數-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; 
    } 
} 
+0

完美,謝謝你。併爲最佳實踐建議! – Goku