Что такое функция sub в perl и как ее использовать

Ответить
admin
Администратор
Сообщения: 185
Зарегистрирован: 05 янв 2011, 04:19

Что такое функция sub в perl и как ее использовать

Сообщение admin »

Что такое функция sub в perl и как ее использовать

Функция sub используется для определения подпрограмм в коде perl-программы.

Именованные объявления

sub NAME PROTO ATTRS
sub NAME ATTRS
sub NAME PROTO
sub NAME

Именованные определения

sub NAME PROTO ATTRS BLOCK
sub NAME ATTRS BLOCK
sub NAME PROTO BLOCK
sub NAME BLOCK

Неименованные определения

sub PROTO ATTRS BLOCK
sub ATTRS BLOCK
sub PROTO BLOCK
sub BLOCK

Т.е. функция sub принимает в качестве параметров значения NAME PROTO ATTRS BLOCK — все они не являются обязательными. Главное условие: должен быть задан хотя бы один параметр — NAME или BLOCK.


Параметр NAME — задает имя подпрограммы

Если указан только параметр NAME, конструкция будет считаться предварительным объявлением имени подпрограммы, и в дальнейшем нужно будет определить саму подпрограмму.

Пример:

sub function1;
...

sub function1 {print "OK";}

Если NAME задана вместе с BLOCK, то конструкция будет считаться стандартным именованным определением подпрограммы. В дальнейшем подпрограмму можно вызывать по имени.

Пример:

sub function1 {return "OK";}

$status = function1; # вызов подпрограммы


Параметр BLOCK — задает код подпрограммы

Может указываться без NAME. В этом случае функция sub вернет ссылку на код. Ссылку можно использовать для вызова и выполнения заданной подпрограммы.

Подобная подпрограмма будет называться анонимной.

Пример:

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 — используется при работе с потоками. При установке данного атрибута использование функции ограничивается только одним потоком в определенный момент времени (а остальные в это время сидят, нервно курят и ожидают освобождения подпрограммы).

sub function1 : locked { return "OK"; }

Атрибут method — указывает, что подпрограмма является методом какого-то объекта.
В сочетании с атрибутом locked организует не только блокировку подпрограммы и возможность ее использования только одним потоком, но и блокировку объекта, который вызывает этот метод.

Использование атрибута method без locked довольно бессмысленно.

sub function1 : locked method { return "OK"; }

Атрибут lvalue — позволяет присвоить подпрограмме значение. При этом, подпрограмма должна возвращать значение, которое допускает такое присваивание.

Пример:

my $value;

sub function : lvalue {
$value;
};

function() = 20;

print $value; # напечатает '20'

В чем смысл практического применения такого атрибута — для меня пока загадка.

Perl предоставляет возможности для самостоятельного создания атрибутов. Но в данном документе эту проблему я рассматривать не буду.


Параметр PROTO — задает список прототипов

Прототипы позволяют ввести проверку типа передаваемых подпрограмме данных. Проверка
осуществляется на стадии компиляции программы.

Пример:

С помощью прототипов указано, что подпрограмма может принимать 2 параметра — скаляр и хэш, в заданном порядке.

#!/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 вернет ошибку:

%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.
\символ — подпрограмме должна быть передана переменная типа «символ».
; — символ «;» отделяет обязательные параметры от необязательных.
@ — объединяет все оставшиеся параметры и передает их подпрограмме как список.
% — объединяет все оставшиеся параметры и передает их подпрограмме как список.

Проверка прототипов не производится, если:

подпрограмма является методом объекта,
подпрограмма вызывается с указанием префикса «&».
Ответить