Поскольку передача ссылок на подпрограммы другим подпрограммам является довольно распространенным шаблоном, в 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 НЕ предназначены для проверки аргументов, они являются подсказками для компилятора, которые позволяют вам писать подпрограммы, которые ведут себя как встроенные.
person
Eric Strom
schedule
18.09.2010