{
sub a {
print 1;
}
}
a;
一个错误,是吗?
a
不应该从外部获得。
它在 Perl 6* 中工作吗?
* 抱歉,我还没有安装它。
最佳答案
您是否在问为什么子在 block 外可见?如果是这样,那么它是因为编译时 sub
关键字将 sub 放在 main
命名空间中(除非您使用 package
关键字创建新的命名空间)。你可以尝试类似的东西
{
my $a = sub {
print 1;
};
$a->(); # works
}
$a->(); # fails
在这种情况下,sub
关键字不会创建子并将其放入 main
命名空间中,而是创建一个匿名子例程并将其存储在词法作用域变量中。当变量超出范围时,它不再可用(通常)。
要了解更多信息,请查看 perldoc perlsub
此外,您是否知道可以检查 Perl 解析器查看代码的方式?使用标志 -MO=Deparse
运行 perl,如 perl -MO=Deparse yourscript.pl
中所示。您的原始代码解析为:
sub a {
print 1;
}
{;};
a ;
首先编译子程序,然后运行一个没有代码的 block ,然后调用 a
。
对于我在 Perl 6 中的示例,请参阅: Success , Failure 。请注意,在 Perl 6 中,取消引用是 .
而不是 ->
。
编辑:我添加了 another answer关于 Perl 5.18 预计对词汇子例程的新实验支持。
关于perl - Perl subs 没有词法作用域是一个设计缺陷吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7523757/