Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Скидка до 20% на услуги дата-центра. Аренда серверной стойки. Colocation от 1U!

Миграция в облако #SotelCloud. Виртуальный сервер в облаке. Выбрать конфигурацию на сайте!

Виртуальная АТС для вашего бизнеса. Приветственные бонусы для новых клиентов!

Виртуальные VPS серверы в РФ и ЕС

Dedicated серверы в РФ и ЕС

По промокоду CITFORUM скидка 30% на заказ VPS\VDS

VPS/VDS серверы. 30 локаций на выбор

Серверы VPS/VDS с большим диском

Хорошие условия для реселлеров

4VPS.SU - VPS в 17-ти странах

2Gbit/s безлимит

Современное железо!

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

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

  • 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).

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

[Назад] [Содержание] [Вперед]
Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

✅ Дешевый VPS-хостинг на AMD EPYC: 1vCore, 3GB DDR4, 15GB NVMe всего за €3,50!

🔥 Anti-DDoS защита 12 Тбит/с!

VPS в России, Европе и США

Бесплатная поддержка и администрирование

Оплата российскими и международными картами

🔥 VPS до 5.7 ГГц под любые задачи с AntiDDoS в 7 локациях

💸 Гифткод CITFORUM (250р на баланс) и попробуйте уже сейчас!

🛒 Скидка 15% на первый платеж (в течение 24ч)

Новости мира IT:

Архив новостей

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 7861149
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...