BEGIN块中匿名子例程的参数

时间:2014-05-19 15:34:00

标签: perl

我看到了下一个结构的一个源代码:

our %hash;
BEGIN {
    %hash = (
         KEY1 =>
          sub { return $_[0]->somefunc( 1, $_[2]->attr1, $_[2]->attr2 ); },
         KEY2 =>
          sub { return $_[0]->somefunc( 0, $_[2]->attr1, $_[2]->attr2 ); },
         ...
    );
}

那些$_[0](它们是匿名子的第一个arg)是什么 - 但是这里是BEGIN块...所以,它在"汇编&#34的价值是什么? ;相位θ

$hash{KEY1}得到一个子程序引用,但到了什么子程序?

修改

现在(我希望)理解。只需将%hash的内容转储到Data::Dumper::Concise,然后获得下一个内容:

  ...
  KEY1 => sub {
      package MyPkg;
      use warnings;
      use strict;
      return $_[0]->somefunc(1, $_[2]->attr1, $_[2]->attr2);
  },
  KEY2 => sub {
      package MyPkg;
      use warnings;
      use strict;
      return $_[0]->somefunc(0, $_[2]->attr1, $_[2]->attr2);
  },
  ...

因此,构造返回对匿名子的引用,什么时候执行返回$_[0]->somefunc执行结果与提供的args。

1 个答案:

答案 0 :(得分:3)

sub {}创建一个匿名子例程并返回对它的引用(就像[]{}对数组和哈希一样)。

$_[0]等是该子的参数。

因此,如果您致电$hash{KEY1}->('foo','bar','baz')$_[0]将成为' foo'。

在编译时生成匿名子的事实并不相关。