除了经典的函数调用
sub foo { ... };
foo 1, 2, 3;
Perl 允许定义闭包
my $foo = sub { ... };
$foo->(1, 2, 3);
(在这种情况下,词法本地)
即使我找不到它的非黑客用途,Perl 也允许这样做:
*main::foo = sub { ... }
这获得了与第一种形式几乎相同的效果,除了我必须在参数周围加上括号:
foo(1, 2, 3);
如果我不放括号,我会收到以下错误:
Number found where operator expected at - line 6, near "&main::foo 1"
(Missing operator before 1?)
syntax error at - line 6, near "main::foo 1"
Execution of - aborted due to compilation errors.
...如果我用 &foo 1, 2, 3
语法调用它也会发生这种情况,明确表明它是关于一个函数的。
所以我的问题是:
为什么第一种形式可以省略括号,而第三种形式却不能?
第三种形式有目的吗?在我看来,在包的命名空间中注入(inject)回调是一种不好的做法,因为它会使事情变得隐含且不可检测。
感谢您的任何回答。
最佳答案
*main::foo = sub {
在运行时评估,而在编译时抛出错误。正常的 sub
在编译时被解析,然后 Perl 解析器可以将其名称识别为裸字,但您仍然不能在声明之前使用裸字形式:
foo 1; # Number found where operator expected...
sub foo {
say shift;
}
foo 1; # No error here.
您可以通过将代码封装到 BEGIN block 中来安排代码在编译时进行:
BEGIN {
*main::foo = sub { say shift };
}
foo 1; # No error!
关于Perl `*foo{THING}`,子和括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32630032/