Прототипы подпрограмм - это функция времени компиляции, более или менее эксклюзивная для Perl. Многие встроенные функции Perl навязывают свои аргументы специальным типам контекста (скаляр, список, ссылка, кодовый блок, захват). Прототипы - это способ перенести некоторые из этих функций в пользовательские подпрограммы.
Например, Perl позволяет эффективно генерировать новые синтаксические конструкции с прототипом (&)
. Это используется в таких модулях, как Try :: Tiny для добавления try
и catch
ключевых слов к языку:
try {
die "foo";
} catch {
warn "caught error: $_"; # not $@
};
Это работает, потому что try
и catch
объявлены как sub try (&;@) { ... }
. Синтаксис sub name {...}
эквивалентен BEGIN { *name = sub {...} }
, что означает, что он имеет эффект времени компиляции. В случае try
прототип (&;@)
сообщает компилятору, что каждый раз, когда он видит идентификатор try
, первый аргумент должен быть пустым блоком, а следующий за блоком является необязательным списком.
Это всего лишь один пример прототипов, и они могут делать много других вещей:
$ imposes scalar context on an argument
& imposes code context on an argument
@ imposes list context on an argument
% imposes list context (with an even number of elements)
* imposes glob context on the argument
\$ imposes scalar reference context
\@ imposes array reference context
... for the rest of the sigils
Из-за своей мощи (и отсутствия в других языках) прототипы могут сбивать с толку и лучше всего их использовать при модерации. (как и любая другая расширенная функция Perl).