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

时间:2010-09-18 07:20:17

标签: perl arguments anonymous-function

mysub获取子程序引用作为其第一个参数。

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

语法是否正常(它是否真的是对sub的引用)?

3 个答案:

答案 0 :(得分:8)

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

但是,是的,该语法可以正常工作。

#!/usr/bin/perl

use strict;
use warnings;

sub run_sub {
  shift->();
}

run_sub( sub { print "hello\n"; } );

答案 1 :(得分:5)

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

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

sub function2 (&@) {     # prototyped declaration
    my $code = shift;
    $code->(@_);
}
必须将{p> function1称为:function1 sub{...}, any_other_args

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

因此,您可以将其称为function2 {...} any_other_args,它反映了mapgrepsort等高阶内置的代码块。请注意,代码块之后没有逗号,就像bultins一样。

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

请记住,Perl的原型不适用于参数验证,它们是编译器的提示,允许您编写与内置函数类似的子例程。

答案 2 :(得分:2)

或者(通过@davorg的答案),您可以使用:

sub run_sub
{
    my($funcref) = @_;
    &$funcref();
}

当然,更详细;我想也更清楚一点。但这是Perl - TMTOWTDI!