2013-06-20 31 views
-1

工作我有一個perl腳本,在該腳本中我需要替換文件的每一行中的字符串。我在perl腳本中使用了下面的行。它在-pi -e附近顯示語法錯誤。我究竟做錯了什麼?Perl -pi -e的///'文件名不在perl腳本中。但它在命令行

perl -pi -e 's///' filename 

我有一個用於perl腳本的管道分隔文件。我正在使用該文件內容使用BCP加載到表中。我創建了8個clomuns表,但管道分隔文件只有7列。在那個文件中我需要添加'| '(管道後接空格)符號在每條記錄的末尾。這樣它將匹配表和BCP文件中的列數。因此,在部分perl腳本中,我需要使用's/$/\ | /'的概念。但我喜歡在perl腳本中單行執行此操作。 (如perl -pi -e's/$/\ | /'正在命令行中工作)

回答

3

該命令行是shell命令。不是Perl腳本。此行調用Perl和賦予它的程序:

s/// 

另外設置若干選項(-p,-i),但它仍然是程序調用,不使用Perl表達。

+0

我有一個用於perl腳本的管道分隔文件。我正在使用該文件內容使用BCP加載到表中。我創建了8個clomuns表,但管道分隔文件只有7列。在那個文件中我需要添加'| '(管道後接空格)符號在每條記錄的末尾。這樣它將匹配表和BCP文件中的列數。因此,在部分perl腳本中,我需要使用's/$/\ | /'的概念。但我喜歡在perl腳本中單行執行此操作。 (像perl -pi -e's/$/\//'這是在命令行中工作) – Yusuf

3

命令行代碼是爲shell編寫的,在將控制權交給perl編譯器/解釋程序之前進行解析。

我們可以使用B::Deparse後端處理器,看看有什麼正在這樣

$perl -MO=Deparse -pi -e 's///' filename 

執行Perl代碼,它顯示了相當的Perl程序是

BEGIN { $^I = ""; } 
LINE: while (defined($_ = <ARGV>)) { 
    s///; 
} 
continue { 
    die "-p destination: $!\n" unless print $_; 
} 

我們可以刪除BEGIN塊只要我們確定$^I被定義爲第一個。標籤LINE可以去,因爲它從來沒有使用過。我們也可以避免檢查print的成功。以及一些語法的便利是Perl允許在現實生活中的代碼,我們得到這個

$^I = ""; 
while (<>) { 
    s///; 
    print; 
} 

那爲什麼你和其他的空間進行打印前替換每一個空間?

+0

從這個問題來看,我認爲這不是很有用,它提出了一個漂亮的B :: Deparse先進的工具。 – doubleDown

+1

一般很好的答案,但特別喜歡最後一行。 – Orbling

+2

@doubleDown:儘管知道實際發生的事情很有幫助。這是他們問題的本質,缺乏對發生的事情的理解。 – Orbling

相關問題