可能重複:
How can I check if I have a Perl module before using it?試圖使用eval來檢查Perl模塊
我想EVAL一個類似的使用聲明:EVAL {$使用foo的; }但是在使用正確的語法時遇到問題。我嘗試了各種字符串插值組合,但即使對於不存在的模塊,eval也總是成功。有人可以給我這個手嗎?
可能重複:
How can I check if I have a Perl module before using it?試圖使用eval來檢查Perl模塊
我想EVAL一個類似的使用聲明:EVAL {$使用foo的; }但是在使用正確的語法時遇到問題。我嘗試了各種字符串插值組合,但即使對於不存在的模塊,eval也總是成功。有人可以給我這個手嗎?
你正在尋找的成語是:
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
」。
謝謝,我只是在檢查是否有人提交了答案之前按照我的方式工作。 – Lazloman 2012-02-07 16:51:52
use
是在編譯過程中處理的關鍵字,如註釋中所述,它確實需要您使用裸詞參數。也就是說,沒有變數。
現在,我無法獲得eval { use $foo }
甚至編譯,因爲它會導致語法錯誤,所以腳本永遠不會運行。我不確定你的意思是「永遠成功」,除非你的意思是相反的:「總是失敗」。
我不知道如何'eval'成功;使用'use'使用變量時出現語法錯誤。從'perldoc -f use':「[使用Module LIST]與BEGIN {require Module; import Module LIST;}完全等價,除了Module *必須是一個裸露的單詞。」 – chepner 2012-02-07 15:41:21
定義「eval總是成功」。 – TLP 2012-02-07 15:41:30