2012-02-07 3 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':« [использовать LIST модуля] в точности эквивалентно BEGIN {require Module; import Module LIST;}, за исключением того, что Module * должен * быть голым словом ». – chepner

+0

Определить, что «eval всегда преуспевает». – 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 } даже для компиляции, поскольку он вызывает синтаксическую ошибку, поэтому сценарий никогда не запускается. Я не уверен, что вы имеете в виду именно «всегда преуспевает», если вы не имеете в виду обратное: «всегда терпит неудачу».

Смежные вопросы