Dav*_*d B 2 perl arguments anonymous-function
mysub 获取子例程引用作为其第一个参数.
我可以直接打电话mysub(sub{some subroutine body here})吗?即在通话时定义一个匿名子程序?
语法是否正确(是否真的是对它的引用sub传递)?
你试过的时候发生了什么?这肯定是测试这样的事情是否有效的最好方法.
但是,是的,该语法将正常工作.
#!/usr/bin/perl
use strict;
use warnings;
sub run_sub {
shift->();
}
run_sub( sub { print "hello\n"; } );
Run Code Online (Sandbox Code Playgroud)
由于将子例程引用传递给其他子例程是一种相当常见的模式,因此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的子例程.
| 归档时间: |
|
| 查看次数: |
2469 次 |
| 最近记录: |