mysub
获取子程序引用作为其第一个参数。
我可以简单地拨打mysub(sub{some subroutine body here})
吗?即在通话时定义一个匿名子程序?
语法是否正常(它是否真的是对sub
的引用)?
答案 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
,它反映了map
,grep
和sort
等高阶内置的代码块。请注意,代码块之后没有逗号,就像bultins一样。
您可以在此处找到有关原型的更多信息:http://perldoc.perl.org/perlsub.html#Prototypes
请记住,Perl的原型不适用于参数验证,它们是编译器的提示,允许您编写与内置函数类似的子例程。
答案 2 :(得分:2)
或者(通过@davorg的答案),您可以使用:
sub run_sub
{
my($funcref) = @_;
&$funcref();
}
当然,更详细;我想也更清楚一点。但这是Perl - TMTOWTDI!