WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Архив » Подпрограммы Perl

Подпрограммы Perl


Дата публикации: 17-03-2013

Для применения подпрограммы ее необходимо определить либо в текщем модуле (файле) либо во внешнем модуле (файле). Подпрограммы определяются и декларируются следующим образом:

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() не целесообразно в циклах так как она вызывается каждый раз и таким образом заметно замедляет время выполнения цикла.
Прототипы (prototypes)

Для краткого описаня типа параметров передаваемых подпрограмме можно применять прототипы. В Перл существуют следующие прототипы:
Декларация    Пример вызова
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

Здесь:
\'символ'    параметр с типом 'символ'
'@' или '%'    все оставшиеся параметры как список
'$'    скаляр
'&'    безымянная подпрограмма
'*'    ссылка на таблицу имен
';'    разграничитель обязательных и не обязательных параметров
Ссылка как параметр

Иногда нужно в качестве параметра передать подпрограмме не значение элемента массива а ссылку на него, что бы подпрограмма могла изменить значение элемента. Для этого в Перл к имени переменной добавляется символ '*' Подбное выражение называют 'type glob' так как в Юниксе символом '*' обозначают "все возможные значения". Поэтому '*' для массива означает "все элементы массива".

Для скаляров употряблять '*' не имеет смысла т.к. они и так передаются ссылкой и вы можете изменять значение параметра изменяя например переменную $_[0].
Переопределение встроенных функций

Большинство встроенных функций Перл можно переопределить своими собственными. Обычно это делают для удобства совместимости Перл для разных платформ систем. Для этого нужно перечислить имена этих функций в виде:

use subs 'функция1', 'функция2' ....;

и далее в модуле определить сами функции.
Автозагрузка

Если вы попытаетесь вызвать не существующую функцию то Перл выдаст немедленно сообщение об ошибке. Но если вы определите подпрограмму с именем 'AUTOLOAD' то она будет вызвана с теми же параметрами а переменная $AUTOLOAD будет содержать имя не существующей подпрограммы. Данный механизм очень одобен для средств отладки.

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Март 2017 (1)
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)
Ноябрь 2015 (1)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта

Хотите продать свой сайт?
- Мы быстро и удобно для Вас сможем его купить:
  • Заявка на продажу сайта
  • Раcсматриваем цены на каждый сайт в индивидуальном порядке.

    Случайная цитата

    Roberto Waltman:

    "Объектно-ориентированная версия «спагетти кода» — это, конечно, «лазанья код» (очень много слоев)."

    Опрос

    Какой антивирус Вы используете?

    Kaspersky Antivirus
    NOD32
    Norton Antivirus
    Dr.Web
    Panda
    Аvast!
    ClamWin
    Другой...