Функция sub используется для определения подпрограмм в коде perl-программы.
Именованные объявления
|
1 2 3 4 |
sub NAME PROTO ATTRS sub NAME ATTRS sub NAME PROTO sub NAME |
Именованные определения
|
1 2 3 4 |
sub NAME PROTO ATTRS BLOCK sub NAME ATTRS BLOCK sub NAME PROTO BLOCK sub NAME BLOCK |
Неименованные определения
|
1 2 3 4 |
sub PROTO ATTRS BLOCK sub ATTRS BLOCK sub PROTO BLOCK sub BLOCK |
Т.е. функция sub принимает в качестве параметров значения NAME PROTO ATTRS BLOCK — все они не являются обязательными. Главное условие: должен быть задан хотя бы один параметр — NAME или BLOCK.
Параметр NAME — задает имя подпрограммы
Если указан только параметр NAME, конструкция будет считаться предварительным объявлением имени подпрограммы, и в дальнейшем нужно будет определить саму подпрограмму.
Пример:
|
1 2 3 4 |
sub function1; ... sub function1 {print "OK";} |
Если NAME задана вместе с BLOCK, то конструкция будет считаться стандартным именованным определением подпрограммы. В дальнейшем подпрограмму можно вызывать по имени.
Пример:
|
1 2 3 |
sub function1 {return "OK";} $status = function1; # вызов подпрограммы |
Параметр BLOCK — задает код подпрограммы
Может указываться без NAME. В этом случае функция sub вернет ссылку на код. Ссылку можно использовать для вызова и выполнения заданной подпрограммы.
Подобная подпрограмма будет называться анонимной.
Пример:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
my $param = "rose"; my $func_link = sub { my $param = shift; print $param; return "OK"; }; my $status = &{$func_link}($param); print $status; |
Параметр ATTRS — задает список атрибутов подпрограммы
ATTRS используется сравнительно редко. В списке атрибутов разделителями служат символы двоеточия или пробела.
Существует 3 стандартных атрибута подпрограмм: locked, method, lvalue. Атрибуты влияют на принципы использования подпрограммы.
-
Атрибут locked — используется при работе с потоками. При установке данного атрибута использование функции ограничивается только одним потоком в определенный момент времени (а остальные в это время сидят, нервно курят и ожидают освобождения подпрограммы).
1sub function1 : locked { return "OK"; } -
Атрибут method — указывает, что подпрограмма является методом какого-то объекта.
В сочетании с атрибутом locked организует не только блокировку подпрограммы и возможность ее использования только одним потоком, но и блокировку объекта, который вызывает этот метод.Использование атрибута method без locked довольно бессмысленно.
1sub function1 : locked method { return "OK"; } -
Атрибут lvalue — позволяет присвоить подпрограмме значение. При этом, подпрограмма должна возвращать значение, которое допускает такое присваивание.
Пример:
123456789my $value;sub function : lvalue {$value;};function() = 20;print $value; # напечатает '20'В чем смысл практического применения такого атрибута — для меня пока загадка.
Perl предоставляет возможности для самостоятельного создания атрибутов. Но в данном документе эту проблему я рассматривать не буду.
Параметр PROTO — задает список прототипов
Прототипы позволяют ввести проверку типа передаваемых подпрограмме данных. Проверка
осуществляется на стадии компиляции программы.
Пример:
С помощью прототипов указано, что подпрограмма может принимать 2 параметра — скаляр и хэш, в заданном порядке.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/usr/local/bin/perl sub get ($\%) { my $name = shift; my $params = shift; print $name, "\n"; print $params->{phone}, "\n"; } my %params = ( 'phone' => '8768', 'office' => '457', ); get('Lesly', %params); |
Если попробовать передать подпрограмме больше или меньше параметров, или вместо хеша — ссылку на хеш, то perl вернет ошибку:
|
1 2 3 4 5 |
%perl test.pl Type of arg 2 to main::get must be hash (not hash element) at scalar.pl line 19, near "})" Execution of scalar.pl aborted due to compilation errors. |
При указании прототипов можно использовать следующие символы:
- $ — подпрограмме должен быть передан скаляр.
- & — подпрограмме должна быть передана в качестве параметра другая подпрограмма.
- * — подпрограмме должен быть передан скаляр или ссылка на typeglob.
- \символ — подпрограмме должна быть передана переменная типа «символ».
- ; — символ «;» отделяет обязательные параметры от необязательных.
- @ — объединяет все оставшиеся параметры и передает их подпрограмме как список.
- % — объединяет все оставшиеся параметры и передает их подпрограмме как список.
Проверка прототипов не производится, если:
- подпрограмма является методом объекта,
- подпрограмма вызывается с указанием префикса «&».
Полезная ссылка
www.arininav.ru: Ю. Лукач «Справочник Веб-разработчика». Глава 6.6. Подпрограммы