Справочник по Perl : Функции, относящиеся к управлению выполнением программы

смотрим также

Материал из Справочник Web-языков

Перейти к: навигация, поиск


Содержание

caller

Возвращает контекст выполняемой подпрограммы, если вызвана без параметра. В скалярном контексте возвращает имя пакета, в котором находится вызывающая данную подпрограмму (т.е. если наша подпрограмма вызывается из другой подпрограммы, функции eval() или require() ), или неопределенное значение в противном случае. В списковом контексте возвращает список с разнообразными сведениями. Можно передать в качестве параметра число, определяющее уровень вложенности получаемой информации, т.е к какой подпрограмме она относится: 0 - наша подпрограмма; 1 - подпрограмма, вызывающая нашу, и т.д.

Полный синтаксис:

($package, $filename, $line, $subroutine, $hasargs, $wantarray, $evaltext, $is_require) = caller($i); die

Вне тела функции eval() выводит значения элементов списка, заданного параметром СПИСОК, в стандартный файл ошибок STDERR и завершает выполнение сценария Perl с текущим значением специальной переменной $!. Если используется в теле функции eval(), то сообщение об ошибке помешается в переменную $@ и функция eval() заверщается с неопределенным значением. Такое поведение позволяет использовать функцию die() для генерирования исключительных состояний.

die СПИСОК

do

В действительности не является функцией. Выполняет последовательность операторов Perl, заданных в блоке БЛОК, и возвращает значение последнего выполненного оператора. Если параметром является ВЫРАЖЕНИЕ, то рассматривает его значение как имя файла, который загружает и выполняет как последовательность операторов Perl. Если не удается прочитать файл, возвращает неопределенное значение и помещает в переменную $! сообщение об ошибке; если не может откомпилировать файл, то также возвращает неопределенное значение и помещает сообщение об ошибке в переменную $@. Если содержимое файла успешно откомпилированно, то возвращает значение последнего выполненного оператора.

do БЛОК
do ВЫРАЖЕНИЕ

dump

Создание дампа ядра, которое системной командой undump может быть преобразованно в двоичный выполняемый файл. Если задан параметр МЕТКА, то при повторном вычислении двоичного файла, сначала выполнится оператор goto МЕТКА;. Функция устаревшая - существует компилятор из Perl в C, который выполняет ее функцию.

dump МЕТКА

eval

eval EXPR

Функция eval() рассматривает параметр EXPR как текст Perl-программы, компилирует его и, если не обнаруживает ошибок, выполняет в текущем вычислительном окружении. Если параметр EXPR отсутствует, вместо него по умолчанию используется глобальная переменная $_. Компиляция програмного кода EXPR осуществляется при каждом вызове функции eval() во время выполнения основной программы. Если выполнения мини-программы EXPR завершается успешно, функция eval() возвращает значение последнего выражения, вычисленного внутри EXPR. Если код EXPR содержит синтаксические ошибки, или обращение к функции die(), или возникла ошибка во время выполнения EXPR, то в специальную переменную $@ помещается сообщение об ошибке, а функция eval() возвращает неопределенное значение.

Если скалярной переменной не присвоено никакое допустимое значение (число, строка или ссылка), то говорят, что она имеет неопределенное значение. Неопределенные значения возникают в различных случаях, например, при попытке чтения данных после достижения конца файла или в результате системных ошибок. Неопределенное значение представляется пустой строкой "", но его следует отличать от определенного значения, равного "". Например, в результате выполнения операторов

$e = eval '$a = 1/0'; # деление на 0 
$b = ""; 
print "a= $an" if defined $a; 
print "e= $en" if defined $e; 
print "b= $bn" if defined $b;

переменные $a и $e будут иметь неопределенное значение, а переменная $b - определенное значение "".

Для того чтобы определить, имеет выражение EXPR определенное значение или нет, существует функция defined EXPR, возвращающая соответствующее булевское значение. В данном примере результатом выполнения будет вывод единственной строки b=

Специальная переменная $@ служит для запоминания сообщения об ошибке, возникшей при последнем обращении к функции eval().

Существует вторая форма функции eval()

eval BLOCK,

где BLOCK придставляет собой блок - последовательность операторов, заключенную в фигурные скобки. Вторая форма отличается от первой тем, что синтаксический анализ параметра BLOCK осуществляется всего один раз - во время компиляции основной программы, содержащей обращение к функции eval(). Таким образом, если параметр BLOCK содержит синтаксические ошибки, то они обнаружатся на этапе компиляции основной программы. При использовании первой формы синтаксические ошибки обнаружатся только во время выполнения.

Основным применением функции eval() является перехватывание исключений. Исключением мы называем ошибку, возникающую при выполнении программы, когда нормальная последовательность выполнения прерывается (например, при делении на нуль). Обычно реакцией на исключение является аварийное завершение программы. Язык Perl предоставляет возможность перехватывать исключения без аварийного выхода. Если исключение возникло в основной программе, то программа завершается. Если ошибка возникла внутри мини-программы функции eval(), то аварийно завершается только функция eval(), а основная программа продолжает выполняться и может реагировать на возникшую ошибку, сообщение о которой ей достанется через переменную $@.

В следующем примере функция eval() применяется для перехватывания ошибки, связянной с делением на 0 при вычислении функции ctg(x). Используются встроенные функции sin, cos и warn. Последняя функция осуществляет вывод сообщения, задаваемого ее аргументом, на стандартное устройство вывода ошибок STDERR.

Пример:

#!/bin/perl
$fi = 0.314159265358979;
$f = '$ctg = cod($x)/sin($x)';
for $i (0..10) {
  $x = $i*$fi;
  eval $f;
  print "x= $x     ctg(x) = $stgn" if defined $ctg;
  warn "x= $x ", $@ if not defined $ctg;
};

Вывод программы выглядит следующим образом

x= 0 Illegal division zero at (eval 1) line 1. 
x= 0.314159265358979 ctg(x) = 3.07768353717526 
x= 0.628318530717958 ctg(x) = 1.37638192047118 
. . .

Иногда бывает полезно искусственно вызвать исключительную ситуацию. Для этого можно воспользоваться функцией die() LIST. Назначение функции die() - генерировать исключения. Если функция die() вызывается в основной программе вне функции eval(), то она осуществляет аварийное завершение основной программы и выводит сообщение об ошибке LIST на стандартное устройство вывода ошибок STDERR. Если она вызывается внутри функции eval(), то осуществляется аварийное завершение eval() и помещает сообщение об ошибке в специальную переменную $@.

exit

Немедленно прекращает выполнение программы с кодом завершения, равным значению параметра ВЫРАЖЕНИЕ. Если параметр не задан, программа завершается с кодом 0.

exit [ВЫРАЖЕНИЕ]

return

Выход из подпрограммы, функции eval() или do ФАЙЛ с кодом завершения равным значению параметра ВЫРАЖЕНИЕ. Если в подпрограмме, функции eval() или do ФАЙЛ не используется эта функция, то они завершаются с кодом, равным значению последнего выполненного оператора.

return ВЫРАЖЕНИЕ

sub

В действительности это не функция, а объявление подпрограммы: анонимной (без параметрп ИМЯ, но с блоком операторов БЛОК), прототипа (без блока операторов БЛОК) и нормальной.

sub БЛОК
sub ИМЯ
sub ИМЯ БЛОК

wantarray

Возвращает значение Истина, если контексту выполняемой подпрограммы требуется списковое значение, и Ложь, если требуется скалярное значение. Возвращает неопределенное значение, если подпрограмме требуется безразличный (void) контекст.

wantarray
Источник — «http://www.spravkaweb.ru/perl/progs/»
Добавить страницу в закладки:
РАЗРЕШАЕТСЯ перепечатывать и копировать информацию ТОЛЬКО ПРИ РАЗМЕЩЕНИИ ссылки на оригинал!
(<A href="http://www.spravkaweb.ru/">Справочник Web-языков</A>)
другие проекты
Rambler\'s Top100 Индекс цитирования