Подпрограммы
Для применения подпрограммы ее необходимо определить
либо в текущем модуле (файле), либо во внешнем модуле (файле). Подпрограммы
определяются и декларируются следующим образом:
- 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 переменных
как:
Так для вышеприведенного примера лучше было написать:
Переменные типа local.
В общем лучше использовать private переменные, т.
к. это надежней и быстрее. private переменные обеспечивают лексическую
область применения (видимости), а local - динамическую. Обычно это
переменные форматов, значение которых должно быть видимо из вызываемых
подпрограмм. Применение функции local() нецелесообразно в циклах,
так как она вызывается каждый раз и таким образом заметно увеличивает
время выполнения цикла.
Прототипы (prototypes).
Для краткого описания типа передаваемых подпрограмме
параметров можно применять прототипы. В Perl существуют следующие
прототипы:
Декларация
| Пример вызова
|
sub mylink($$)
| mylink $old, $new
|
sub myvec($$$)
| myvec $var, $offset, 1
|
sub myindex($$;$)
| myindex &getstring, "substr"
|
sub myreverse(@)
| myreverse $a, $b, $c
|
sub myjoin($@)
| myjoin ":",$a,$b,$c
|
sub mypop(\@)
| mypop @array
|
sub mysplice(\@$$@)
| mysplice @array, @array, 0, @pushme
|
sub mykeys(\%)
| mykeys %{$hashref}
|
sub myopen(*;$)
| myopen HANDLE, $name
|
sub mypipe(**)
| mypipe READHANDLE, WRITEHANDLE
|
sub mygrep(&@)
| mygrep { /foo/ } $a, $b, $c
|
sub myrand($)
| myrand 42
|
sub mytime()
| mytime
|
Здесь:
- \'символ' - параметр с типом 'символ'
- '@' или '%' - все оставшиеся параметры как список
- '$' - скаляр
- '&' - безымянная подпрограмма
- '*' - ссылка на таблицу имен
- ';' - разграничитель обязательных и не обязательных параметров.
Ссылка как параметр.
Иногда нужно в качестве параметра передать подпрограмме
не значение элемента массива, а ссылку на него, чтобы подпрограмма
могла изменить значение элемента. Для этого в Perl к имени переменной
добавляется символ '*' Подобное выражение называют 'type glob' так
же как в Unix символом '*' обозначают "все возможные значения".
Поэтому '*' для массива означает "все элементы массива". Для скаляров
употреблять '*' не имеет смысла, т.к. они и так передаются ссылкой
и вы можете изменять значение параметра, изменяя, например, переменную
$_[0].
Переопределение встроенных функций.
Большинство встроенных функций Perl можно переопределить
своими собственными. Обычно это делают для удобства совместимости
Perl для разных платформ систем.
Для этого нужно перечислить имена этих функций в виде:
- use subs 'функция1', 'функция2' ....;
и далее в модуле определить сами функции.
Автозагрузка.
Если вы попытаетесь вызвать несуществующую функцию,
то Perl немедленно выдаст сообщение об ошибке. Но если вы определите
подпрограмму с именем 'AUTOLOAD', то она будет вызвана с теми же
параметрами, а переменная $AUTOLOAD будет содержать имя несуществующей
подпрограммы. Данный механизм очень удобен для средств отладки.
На
верх
|