Поскольку передавая ссылки подпрограммы других подпрограмм является довольно распространенным узором, 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
принимать их кодовые блоки. Обратите внимание, что после блока кода нет запятой, точно так же, как с бултинами.
Вы можете найти более подробную информацию о прототипах здесь: http://perldoc.perl.org/perlsub.html#Prototypes
Имейте в виду, что прототипы в Perl не для проверки аргументов, они намекают на компилятор, который позволит вам написать подпрограммы, которые ведут себя как встроенные команды.
Вы попробовали? –
Я пробовал, и это сработало (в противном случае я бы даже не спросил), НО я вспоминаю несколько примеров из моей истории, когда я тестировал что-то, что я «придумал» на Perl, и это, казалось, сработало, но позже я обнаружил, что он действительно работал только для конкретных случаев у меня есть тестеры, а общая идея/синтаксис, который я использовал, была просто неправильной ... :) –