2012-10-16 69 views
41

我在我的Bash腳本中調用了許多Perl腳本(有時也來自csh)。如何檢查Perl腳本是否沒有編譯錯誤?

在Bash腳本的開始部分,我想放一個測試,檢查所有的Perl腳本是否沒有任何編譯錯誤。

這樣做的一種方法是實際調用Bash腳本中的Perl腳本和grep以獲得管道日誌文件中的「編譯錯誤」,但這會變得混亂,因爲在代碼中的不同點上調用不同的Perl腳本,所以我想在Bash腳本的開頭就這樣做。

有沒有辦法檢查Perl腳本是否沒有編譯錯誤?

回答

59

當心!!

使用下面的命令檢查Perl程序中的編譯錯誤可能是危險的。

$ perl -c yourperlprogram 

蘭德爾寫關於這個主題非常好文章,你應該看看

從他的文章引用:

也許si我們可以說最簡單的事情是「它有效嗎?」。對於這一點,我們 調用Perl本身,通過唯一的編譯開關:

perl -c ourprogram 

對於此操作,perl的編譯程序, 但停止只是短暫的執行階段。這意味着程序文本的每個 部分都被翻譯成代表工作程序的內部數據結構 ,但我們並沒有實際執行 任何代碼。如果有任何語法錯誤,我們會通知您,編譯將中止。

其實,這是一個謊言。由於BEGIN塊(包括 它們的分層表示,使用指令),在理論上安全的「語法檢查」期間,某些Perl代碼可能會執行 。對於 例如,如果你的代碼包含:

BEGIN { warn "Hello, world!\n" } 

然後你會看到,即使是在Perl的-c 該消息!這對於那些認爲「僅編譯」意味着「不執行代碼」的人來說有些令人驚訝。考慮 代碼包含:

BEGIN { system "rm", "-rf", "/" } 

,你會看到的問題 這樣的說法。哎呀。

+0

感謝您瞭解該方法的侷限性。順便說一句,我應該如何管perl -c輸出? 'perl -c script.pl | grep「語法OK」'不能按預期工作。我希望它在包含編譯錯誤時不會返回任何內容。 – user13107

+1

沒關係,明白了! 'perl -c script.pl |&grep「語法OK」' – user13107

+0

最好檢查一下實際的退出值,而不是grep的某些字符串輸出。如果成功,退出值將爲0,如果失敗,則退出值爲非零。 –

-1

當你需要檢查錯誤/運行前警告,但你的文件依賴您可以添加多個其他文件選項-I

perl -I /path/to/dependency/lib -c /path/to/file/to/check 

編輯:從人perlrun通過-I指定

目錄前加上用於模塊(@INC)的搜索路徑。