我看到了下一个结构的一个源代码:
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。
答案 0 :(得分:3)
sub {}
创建一个匿名子例程并返回对它的引用(就像[]
和{}
对数组和哈希一样)。
$_[0]
等是该子的参数。
因此,如果您致电$hash{KEY1}->('foo','bar','baz')
,$_[0]
将成为' foo'。
在编译时生成匿名子的事实并不相关。