在调用Perl子例程时如何传递匿名子例程?

Dav*_*d B 2 perl arguments anonymous-function

mysub 获取子例程引用作为其第一个参数.

我可以直接打电话mysub(sub{some subroutine body here})吗?即在通话时定义一个匿名子程序?

语法是否正确(是否真的是对它的引用sub传递)?

Dav*_*oss 8

你试过的时候发生了什么?这肯定是测试这样的事情是否有效的最好方法.

但是,是的,该语法将正常工作.

#!/usr/bin/perl

use strict;
use warnings;

sub run_sub {
  shift->();
}

run_sub( sub { print "hello\n"; } );
Run Code Online (Sandbox Code Playgroud)


Eri*_*rom 5

由于将子例程引用传递给其他子例程是一种相当常见的模式,因此Perl甚至还有一些语法技巧可以使它更加平滑:

sub function1 {          # normal declaration, implicit `(@)` prototype
    my $code = shift;
    $code->(@_);
}

sub function2 (&@) {     # prototyped declaration
    my $code = shift;
    $code->(@_);
}
Run Code Online (Sandbox Code Playgroud)

function1 必须被称为: function1 sub{...}, any_other_args

function2有原型(&@)告诉编译器在第一个参数上强加子程序上下文(然后接受任意数量的附加参数).

所以,你可以把它作为function2 {...} any_other_args这反映了这样的高阶内建像map,grep以及sort把他们的代码块.请注意,代码块后面没有逗号,就像bultins一样.

您可以在此处找到有关原型的更多信息:http://perldoc.perl.org/perlsub.html#Prototypes

请记住,Perl的原型不是用于参数验证,它们是编译器的提示,允许您编写行为类似于builtins的子例程.