Поскольку передача ссылок на подпрограммы в другие подпрограммы является довольно распространенным шаблоном, Perl даже имеет несколько синтаксических приемов, чтобы сделать его еще более плавным:
sub function1 { # normal declaration, implicit `(@)` prototype
my $code = shift;
$code->(@_);
}
sub function2 (&@) { # prototyped declaration
my $code = shift;
$code->(@_);
}
function1
должен называться: function1 sub{...}, any_other_args
function2
имеет прототип (&@)
, который указывает компилятору наложить контекст подпрограммы на первый аргумент (а затем принять любое количество дополнительных аргументов).
Таким образом, вы можете назвать его как function2 {...} any_other_args
, который отражает способ, которым встроенные функции более высокого порядка, такие как map
, grep
и sort
, принимают свои кодовые блоки.Обратите внимание, что после блока кода нет запятой, как и в случае с bultins.
Более подробную информацию о прототипах можно найти здесь: http://perldoc.perl.org/perlsub.html#Prototypes
Имейте в виду, что прототипы Perl НЕ предназначены дляпроверка аргументов, это подсказки компилятору, которые позволяют вам писать подпрограммы, которые ведут себя как встроенные.