Иллюстрированный самоучитель по Perl

Прототипы

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

sub func ($$) {
}

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

Таблица 11.1. Символы, используемые в прототипах для задания типа аргумента.

Символ Тип данных
$ Скаляр
@ Массив
% Ассоциативный массив
& Анонимная подпрограмма
* Тип typeglob

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

В табл. 11.2 в качестве примера приведены объявления пользовательских функции nybud,itin(), синтаксис которых соответствует синтаксису встроенных функций buil tin ().

Таблица 11.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, vOf f
sub myreverse (@) myreverse $a, $b, $c
sub my join ($@j myjoin ":", $a, $b, $c
sub mypop (\@) mypop garray
sub mysplice (\@$$@) mysplice Sarray, @array, 0, @pushme
sub mykeys (\%) mykeys %{$hashref}
sub myopen (*;$) myopen HANDLE, $name
sub mypipe (**) mypipe READER, WRITER
sub mygrep (s@) mygrep { /pattern/ } $a, $b, $c
sub myrand ($) myrand 42
sub mytime () mytime

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

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.