Первый сайт на Perl

       

Прототипы



Прототипы

Встроенные функции 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.



Содержание раздела