Для применения подпрограммы ее необходимо определить либо в текущем модуле (файле), либо во внешнем модуле (файле). Подпрограммы определяются и декларируются следующим образом:
- sub имя; - Только декларация. Определение ниже.
- sub имя (прототипы); - То же но с декларацией параметров.
- sub имя блок; - Декларация и определение.
- sub имя (прототипы) блок; - То же, но с параметрами.
Для определения динамической анонимной подпрограммы можно указать: $переменная = sub блок; Для импортирования подпрограмм из других модулей используйте: use модуль qw(подпрограмма1 подпрограмма2 ); Вызов подпрограммы: имя(список параметров); # символ "&" можно не указывать. имя список; # Если подпрограмма уже декларирована. &имя; # Параметры в @_
Все параметры передаются подпрограмме как массив @_. Соответственно $_[0] - первый параметр, $_[1] - второй и т.д. Массив @_ - локальный, но он содержит адреса параметров, поэтому можно изменять значение параметров. Возвращаемое значение подпрограммы - результат последнего оператора. Это может быть как скаляр так и массив. Можно принудительно возвращать результат используя функцию return().
Подпрограмму можно вызвать, используя префикс "&" перед именем подпрограммы. Если подпрограмма предварительно продекларирована, то префикс и скобки можно опустить.
Private переменные.
Для применения переменных доступных только внутри блока или подпрограммы необходимо определить их с помощью функции my(список). Если переменная одна, то скобки можно опустить.
my() декларирует private переменные в пределах текущей подпрограммы, блока, функции eval() или do/require/use файлов. Private переменные аналогичны auto переменным в С.
Пример:
# Программа вычисления факториала. print fact(3); # вычислить факториал 3*2*1 sub fact # Определяем подпрограмму. { my $m; # private переменная но не local ! $m = $_[0]; return 1 if $m <= 1; return($m * fact($m -1)); }
Можно указывать начальные значения private переменных как:
my(список) = выражение; Так для вышеприведенного примера лучше было написать: my($m) = $_[0];
Переменные типа local.
В общем лучше использовать private переменные, т. к. это надежней и быстрее. private переменные обеспечивают лексическую область применения (видимости), а local - динамическую. Обычно это переменные форматов, значение которых должно быть видимо из вызываемых подпрограмм. Применение функции local() нецелесообразно в циклах, так как она вызывается каждый раз и таким образом заметно увеличивает время выполнения цикла.
1 2
8 8 8
| |