Прототипы
Встроенные функции Perl имеют определенный синтаксис: имя, число и тип параметров. Прототипы позволяют накладывать ограничения на синтаксис функции, объявляемой пользователем. Прототип представляет собой запись, которая состоит из заключенного в скобки списка символов, определяющих количество и тип параметров подпрограммы. Например, объявление
sub func ($$) {
1
определяет функцию 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.