Язык программирования Perl
Шрифт:
Чтобы обращаться к пользовательской подпрограмме в стиле встроенных функций без круглых скобок, нужно чтобы определение или объявление подпрограммы было известно компилятору раньше ее вызова.
В Perl
Для разработки универсальных подпрограмм программисту нужно знать, в каком контексте была вызвана подпрограмма - какого возвращаемого значения от нее ожидают. Для этого в Perl предусмотрена функция wantarray. Она возвращает истинное значение, если подпрограмма вызвана в списочном контексте, ложное значение, если подпрограмма вызвана в скалярном контексте, и неопределенное значение, если подпрограмма вызвана в пустом контексте. Проверка ожидаемого значения в подпрограмме и примеры ее вызова могут выглядеть так:
В Perl программисту предоставляется возможность выполнить во время компиляции ограниченную проверку количества и типов параметров у подпрограммы. Это делается с помощью прототипа списка параметров. Для этого в определении и в объявлении подпрограммы после ее имени в круглых скобках указывается прототип. Прототип представляет из себя последовательность разыменовывающих суффиксов, определяющих количество параметров подпрограммы и типы их контекстов. Вот несколько примеров определения подпрограмм с прототипами:
Для подпрограмм, определенных с прототипами, компилятор контролирует количество
Перечень символов, применяемых для описания прототипов, с примерами определения подпрограмм приведен в таблице 12.1.
Таблица 12.1. Обозначение прототипов подпрограмм
Прототип | Требования к параметрам | Пример определения / описания | Пример вызова |
---|---|---|---|
отсутствие аргументов | sub mytime | mytime; | |
$ | скалярное значение | sub myrand ($) sub myrename ($$) | myrand 100; myrename $old, $new; |
@ | список скалярных значений (поглощает остальные параметры, поэтому употребляется последним в списке) | sub myreverse (@) sub myjoin ($@) | myreverse $a, $b, $c; myjoin ':', $x, $y, $z; |
& | подпрограмма | sub mygrep (&@) | mygrep {/pat/} $a, $b, $c; |
* | элемент таблицы символов (например, дескриптор файла) | sub myopen (*$) | myopen HANDLE, $name; |
\ | взятие ссылки на следующий за ней прототип | sub mykeys (\%) sub mypop (\@) sub mypush(\@@) | mykeys %hash; mypop @array; mypush @stack, $a, $b; |
; | разделитель обязательных параметров от необязательных (в конце списка) | sub mysubstr ($$;$) | mysubstr $str, $pos; mysubstr $str, $pos, $length; |
Проверки на соответствие прототипам не выполняются, если подпрограмма вызывается устаревшим способом (с префиксом &), а также для методов и подпрограмм, вызываемых через ссылки.
Скалярные переменные могут хранить ссылки не только на данные, но и на подпрограммы. В операции взятия ссылки имя подпрограммы должно использоваться с разыменовывающим префиксом &, как это показано в следующем примере:
Первый способ обращения к подпрограмме через ссылочную переменную оформляется аналогично обращению к элементу массива или хэша: после имени переменной, содержащей ссылку на подпрограмму, записывается операция разыменования ссылки (->), за которой обязательно указываются круглые скобки (со списком аргументов или без него), которые показывают, что это обращение к подпрограмме: