2012-02-07 9 views
0

可能性の重複:
How can I check if I have a Perl module before using it?Perlモジュールをチェックするためにevalを使用しようとすると

が、私はこれに似use文にevalしたいと思います:evalを{利用の$ fooのを。 }正しい構文に問題があります。私は文字列補間のさまざまな組み合わせを試しましたが、存在しないモジュールでもevalは常に成功します。誰かが私にこの1つを与えることができますか?

+2

'eval'がどのように成功しているかわかりません。 'use'で変数を使うときに文法エラーが出ます。 'perldoc -f use'から:" [module LISTを使う]はBEGIN {require Module; import module LIST;}とまったく同じですが、Module *はあまり意味のない単語でなければなりません。 – chepner

+0

"eval always succeeds"を定義します。 – TLP

答えて

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

0

useは、コメントに記載されているように、コンパイル時に処理されるキーワードです。裸語の引数を使用する必要があります。つまり、変数はありません。

eval { use $foo }をコンパイルすることはできません。構文エラーが発生するため、スクリプトは実行されないためです。私はあなたが「常に成功する」ことによってあなたがどういう意味をしているのか分からない。

関連する問題