Шаг 121.
Прототипы

    На этом шаге мы рассмотрим определение прототипов.

    Встроенные функции Perl имеют определенный синтаксис: имя, число и тип параметров. Прототипы позволяют накладывать ограничения на синтаксис функции, объявляемой пользователем. Прототип представляет собой запись, которая состоит из заключенного в скобки списка символов, определяющих количество и тип параметров подпрограммы. Например, объявление

sub func ($$) 
{
 .    .    .    .
}
определяет функцию func() с двумя скалярными аргументами. Символы для обозначения типа аргумента приведены в таблице 1

Таблица 1. Символы, используемые в прототипах для задания типа аргумента
Символ Тип данных
$ Скаляр
@ Массив
% Ассоциативный массив
& Анонимная подпрограмма
* Тип typeglob

    Запись вида \char, где char - один из символов таблицы 1, обозначает, что при вызове подпрограммы имя фактического параметра должно обязательно начинаться с символа char. В этом случае в подпрограмму через массив параметров @_ передается ссылка на фактический параметр, указанный при ее вызове. Обязательные параметры в прототипе отделяются от необязательных точкой с запятой.

    В таблице 2 в качестве примера приведены объявления пользовательских функций mybuiltin(), синтаксис которых соответствует синтаксису встроенных функций builtin().

Таблица 2. Примеры прототипов
Объявление Обращение к функции
sub mylink ($$) mylink $old, $new
sub myvec ($$$) myvec $var, $offset, 1
sub myindex ($$;$) myindex sgetstring, "substr"
sub mysyswrite ($$$;$) mysyswrite $buf, 0, length($buf) - $off, $off
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 READER, WRITER
sub mygrep (&@) mygrep { /pattern/ } $a, $b, $c
sub myrand ($) myrand 42
sub mytime () mytime

    Следует иметь в виду, что проверка синтаксиса, задаваемого при помощи прототипа, не осуществляется, если подпрограмма вызвана с использованием префикса &: &subname.

    На следующем шаге мы рассмотрим рекурсивные функции.




Предыдущий шаг Содержание Следующий шаг