有谁知道如何理解这种Perl代码块?

Hao*_*Hao 6 perl

我对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"是命名块,但不是函数.有谁知道它们是什么?任何可用的链接介绍它们?我找不到任何这种语法的参考.

mvp*_*mvp 9

让我们解释这个定义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使用括号中的匿名过程代码调用.


Сух*_*й27 5

Run,cmd和,expectprototype定义的函数,它们像内置函数一样工作(不需要编写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)