|
1 2 |
eval EXPR eval BLOCK |
При работе с функцией eval, можно использовать 2 варианта записи функции: eval BLOCK и eval EXPR. Каждый из вариантов имеет свои особенности в использовании.
eval BLOCK
Если задан eval BLOCK, функция выполняет перехват исключительных ситуаций, которые привели бы к возникновению фатальной ошибки и аварийному завершению программы.
eval BLOCK является альтернативой оператору «try» в Python, Java, и т.п.
Функция eval возвращает значение, полученное в результате последнего проведенного вычисления. Если во время выполнения eval возникает исключительная ситуация, то eval возвращает undef, и помещает в переменную $@ текст произошедшей ошибки. Если ошибка не возникла, значение переменной $@ будет равно пустой строке. Для возврата значений можно использовать в теле BLOCK функцию return.
Код, размещенный в BLOCK, проверяется и компилируется одновременно с компиляцией всей программы.
Стандартный пример использования eval BLOCK:
|
1 2 3 |
eval { ... }; if ($@) { ... }; |
Форма eval BLOCK работает значительно быстрее, чем eval EXPR.
При равных условиях, использование формы eval BLOCK предпочтительнее, чем eval EXPR.
Пример использования eval BLOCK
С помощью eval BLOCK очень удобно проверять доступность тех или иных модулей:
|
1 2 3 4 5 6 |
eval { require PDF::API3; }; if ($@) { print "Need install module PDF::API3"; } |
Можно использовать eval BLOCK, если есть сомнения в возможности вызова подпрограмм:
|
1 2 3 4 5 6 7 8 9 10 |
use My::Module; my $my_object = eval {My::Module->new}; if ($@) { print "Error"; exit; } $my_object->my_method; |
или так:
|
1 2 3 4 |
eval { $obj->create_db_connect($user, $pass); $obj->run_mode("update"); }; |
eval EXPR
eval EXPR компилирует и выполняет код заданного выражения на этапе исполнения программы. Если во время выполнения eval EXPR возникает исключительная ситуация, функция возвращает undef, в переменную $@ передается текст произошедшей ошибки.
Если исключительная ситуация не возникла, eval возвращает результат последнего вычисления.
Использовать eval надо осторожно. Если функции eval передаются введенные пользователем данные — эти данные нужно тщательно проверять, во избежание запуска вредоносного кода и взлома системы.
Пример использования eval EXPR
eval EXPR можно использовать, если заранее не известно, какие команды и подпрограммы потребуется выполнить.
|
1 2 3 4 5 |
eval "require $ARGV[0]"; if ($@) { print "Need install $ARGV[0] \n\n"; } |