Perl `*foo{THING}`,子和括号

标签 perl

除了经典的函数调用

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/

相关文章:

Perlbrew 安装失败

arrays - PERL : How to create table from an array?

Perl - 平方根结果

perl - 这个 if 语句有什么问题?

c - FreeBSD 以太网操作

sql - 当对DBI进行子类化时,Perl DBI将设置SQLite DB cache_size视为写操作

regex - 在Perl中,如何匹配两个连续的回车符?

perl - 如何使Moose构造函数在传递未声明的属性时死亡?

perl - 未定义的子程序调用

perl - 在 Perl 中使用 "sort"作为 utf8 字符串