我对Perl Named Blocks感到困惑(我以为它们是......).以下是一个例子:
#!/usr/bin/perl
sub Run(&){
my ($decl) = @_;
$decl->();
}
sub cmd(&){
my($decl) = @_;
my(@params) = $decl->();
print "@params\n";
}
sub expect(&){
my ($decl) = @_;
my(@params) = $decl->();
print "@params\n";
}
Run {
cmd { "echo hello world " };
expect { exit_code => 0, capture => 2};
};
Run Code Online (Sandbox Code Playgroud)
注意最后一行.它看起来像"Run","cmd","expect"是命名块,但不是函数.有谁知道它们是什么?任何可用的链接介绍它们?我找不到任何这种语法的参考.
让我们解释这个定义Run:
sub Run(&){
my ($decl) = @_;
$decl->();
}
Run Code Online (Sandbox Code Playgroud)
它表示调用子程序Run,它接受类型的参数CODE(这就是它使用的原因(&)).在里面它$decl被分配给那个传递的代码,并且这个代码被调用$decl->();.
现在,您的示例中的最后一行:
Run {
cmd { "echo hello world " };
expect { exit_code => 0, capture => 2};
};
Run Code Online (Sandbox Code Playgroud)
相当于:
Run(sub {
cmd { "echo hello world " };
expect { exit_code => 0, capture => 2};
});
Run Code Online (Sandbox Code Playgroud)
换句话说,它Run使用括号中的匿名过程代码调用.
Run,cmd和,expect是prototype定义的函数,它们像内置函数一样工作(不需要编写sub{..},因为这是(&)这些函数的隐式签名).
如果定义这些函数没有原型,
sub Run { .. }
sub cmd { .. }
sub expect { .. }
Run Code Online (Sandbox Code Playgroud)
那么显式sub{}参数不是可选的,而是必需的,
Run(sub{
cmd(sub{ "echo hello world " });
expect(sub{ exit_code => 0, capture => 2});
});
Run Code Online (Sandbox Code Playgroud)