На этом шаге мы рассмотрим определение прототипов.
Встроенные функции Perl имеют определенный синтаксис: имя, число и тип параметров. Прототипы позволяют накладывать ограничения на синтаксис функции, объявляемой пользователем. Прототип представляет собой запись, которая состоит из заключенного в скобки списка символов, определяющих количество и тип параметров подпрограммы. Например, объявление
sub func ($$)
{
. . . .
}
| Символ | Тип данных |
|---|---|
| $ | Скаляр |
| @ | Массив |
| % | Ассоциативный массив |
| & | Анонимная подпрограмма |
| * | Тип typeglob |
Запись вида \char, где char - один из символов таблицы 1, обозначает, что при вызове подпрограммы имя фактического параметра должно обязательно начинаться с символа char. В этом случае в подпрограмму через массив параметров @_ передается ссылка на фактический параметр, указанный при ее вызове. Обязательные параметры в прототипе отделяются от необязательных точкой с запятой.
В таблице 2 в качестве примера приведены объявления пользовательских функций mybuiltin(), синтаксис которых соответствует синтаксису встроенных функций builtin().
| Объявление | Обращение к функции |
|---|---|
| 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.
На следующем шаге мы рассмотрим рекурсивные функции.