Прототипы

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

Следующая страница Содержание главы





Нет комментариев.



Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: