2012-02-07 31 views
0

可能重複:
How can I check if I have a Perl module before using it?試圖使用eval來檢查Perl模塊

我想EVAL一個類似的使用聲明:EVAL {$使用foo的; }但是在使用正確的語法時遇到問題。我嘗試了各種字符串插值組合,但即使對於不存在的模塊,eval也總是成功。有人可以給我這個手嗎?

+2

我不知道如何'eval'成功;使用'use'使用變量時出現語法錯誤。從'perldoc -f use':「[使用Module LIST]與BEGIN {require Module; import Module LIST;}完全等價,除了Module *必須是一個裸露的單詞。」 – chepner 2012-02-07 15:41:21

+0

定義「eval總是成功」。 – TLP 2012-02-07 15:41:30

回答

5

你正在尋找的成語是:

eval "use $module; 1" or ... ; 

eval "use $module; 1" or warn "$module is not available: [email protected]"; 
eval "use $module; 1" or die "This script requires $module"; 
eval "use $module; 1" or $module_available = 0; 

eval「總是會成功」,在這個意義上,程序將繼續執行,無論是評估哪些代碼 - 這是一個真正的eval語句的整點。如果評估的字符串包含錯誤 - 運行時間或編譯時間 - eval調用的返回值爲undef,並且將使用適當的錯誤消息設置特殊變量[email protected]

use聲明,即使成功,也不返回值。這就是爲什麼這個成語在最後包含「; 1」。

+0

謝謝,我只是在檢查是否有人提交了答案之前按照我的方式工作。 – Lazloman 2012-02-07 16:51:52

0

use是在編譯過程中處理的關鍵字,如註釋中所述,它確實需要您使用裸詞參數。也就是說,沒有變數。

現在,我無法獲得eval { use $foo }甚至編譯,因爲它會導致語法錯誤,所以腳本永遠不會運行。我不確定你的意思是「永遠成功」,除非你的意思是相反的:「總是失敗」。