可能性の重複:
How can I check if I have a Perl module before using it?Perlモジュールをチェックするためにevalを使用しようとすると
が、私はこれに似use文にevalしたいと思います:evalを{利用の$ fooのを。 }正しい構文に問題があります。私は文字列補間のさまざまな組み合わせを試しましたが、存在しないモジュールでもevalは常に成功します。誰かが私にこの1つを与えることができますか?
可能性の重複:
How can I check if I have a Perl module before using it?Perlモジュールをチェックするためにevalを使用しようとすると
が、私はこれに似use文にevalしたいと思います:evalを{利用の$ fooのを。 }正しい構文に問題があります。私は文字列補間のさまざまな組み合わせを試しましたが、存在しないモジュールでもevalは常に成功します。誰かが私にこの1つを与えることができますか?
あなたが探しているイディオムはされています。プログラムの実行が評価されたどのようなコードに関係なく継続するという意味で「常に成功」
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
use
は、コメントに記載されているように、コンパイル時に処理されるキーワードです。裸語の引数を使用する必要があります。つまり、変数はありません。
eval { use $foo }
をコンパイルすることはできません。構文エラーが発生するため、スクリプトは実行されないためです。私はあなたが「常に成功する」ことによってあなたがどういう意味をしているのか分からない。
'eval'がどのように成功しているかわかりません。 'use'で変数を使うときに文法エラーが出ます。 'perldoc -f use'から:" [module LISTを使う]はBEGIN {require Module; import module LIST;}とまったく同じですが、Module *はあまり意味のない単語でなければなりません。 – chepner
"eval always succeeds"を定義します。 – TLP