|
Поиск по сайту:
Главная
О проекте
Web-мастеру
HTML & JavaScript
SSI
Perl
PHP
XML & XSLT
Unix Shell
MySQL
Безопасность
Хостинг
Другое
|
|
4.5 Подпрограммы и модули
4.5.1 Подпрограммы
Описать и использовать подпрограмму можно несколькими способами:
-
sub NAME; - подразумевает описание в дальнейшем тела подпрограммы.
-
sub NAME BLOCK - непосредственное описание.
-
$subref = sub BLOCK - анонимное описание.
-
use PACKAGE qw(NAME1, NAME2, NAME3) - включение подпрограмм из модулей.
Вызвать подпрограмму можно тоже несколькими способами:
-
&NAME(LIST) - скобки обязательны для & формы.
-
NAME(LIST) - & не обязательно со скобками.
-
NAME LIST - скобки можно опустить в случае предварительного описания или включения подпрограммы из модуля.
Аргументы передаются подпрограмме в виде локального массива @_ , его элементы являются ссылками на реальные скалярные параметры. Подпрограмма возвращает значение, полученное в результате исполнения последнего оператора подпрограммы. Как уже говорилось, подпрограмма вызывается использованием префикса & перед ее именем, в Perl 5 этот префикс не обязателен. Пример:
sub MAX {
my $max = pop(@_);
foreach $foo (@_) {
$max = $foo if $max < $foo;
}
$max;
}
...
$bestmark = &MAX(1,2,3,4,5);
Подпрограмма может вызываться рекурсивно. Если подпрограмма вызывается с использованием & формы, то список аргументов необязателен. Если вы хотите создать внутри модуля его собственную, невидимую снаружи подпрограмму, то описание должно быть анонимным:
my $subref = sub {...}
&$subref(1,2,3);
4.5.2 Пакеты
Perl поддерживает механизм альтернативного именного пространства для каждого отдельного пакета. Обычная программа является пакетом с именем main . Можно ссылаться на переменные или дескрипторы файлов из других пакетов посредством использования префикса перед именем переменной, состоящего из имени пакета и двойного двоеточия: $Package::Variable . Если имя пакета нулевое, то предполагается использование переменной из main пакета. То есть $::sail эквивалентно $main::sail . Пакеты могут включать в себя другие пакеты, в таком случае чтобы обратиться к переменной нужно применить описанное обозначение рекурсивно: $OUTER::INNER::var .
В пакете могут содержаться только переменные, чьи имена начинаются с буквы или подчерка, остальные переменные содержатся в пакете main. Кроме того зарезервированные переменные, как то STDIN, STDOUT, STDERR, ARGV, ARGVOUT, ENV, INC и SIG также содержатся в главном пакете.
package mypack;
sub main::mysub {
...
}
4.5.3 Таблицы символов
Таблицы символов пакета хранятся в ассоциативном массиве с тем же именем и двойным двоеточием в конце. Для пакетов включенных в пакет имя символьной таблицы составляется аналогичным образом: %OUTER::INNER:: .
4.5.4 Конструкторы и деструкторы пакетов
Существует две функции специального вида - конструкторы и деструкторы. Это BEGIN и END программы в их описании необязательно использование sub . Подпрограмма BEGIN исполняется сразу, как только это возможно, то есть в момент, когда она полностью определена, даже перед тем как обрабатывается остаток содержащего файла. В файле может быть несколько блоков BEGIN . Они исполняются в порядке определения.
Подпрограмма END исполняется в самом конце. В файле может содержаться несколько END блоков, они исполняются в обратном порядке.
4.5.5 Классы
В Perl 5 нет специального синтаксиса для описания классов, но пакеты могут функционировать как классы, если они содержат подпрограммы функционирующие как методы. Такие пакеты могут также брать некоторые методы из других пакетов-классов. Для этого необходимо перечислить имена других пакетов в массиве @ISA .
4.5.6 Модули
В Perl 5 понятие пакетов расширено в понятие модулей. Модули это пакеты находящиеся в одноименном файле, включенном в библиотеку. Модули подключаются следующим образом:
use Module; или use Module LIST;
Это эквивалентно:
BEGIN { require "Module.pm"; import Module; }
Все модули имеют расширение .pm . Если именное пространство модуля пересекается с именным пространством основной программы то всегда используется use , если не пересекается то можно использовать require . Стандартные модули Perl описаны в документации.
[Назад]
[Содержание]
[Вперед]
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|
|
|