{ sub a { print 1; } } a;
一个bug,是吗
a不应该从外面提供.
它在Perl 6 *中工作吗?
对不起,我还没有安装
解决方法
你问为什么这个sub在块之外可见?如果是这样,那么因为编译时间子关键字将sub放在主命名空间中(除非你使用package关键字来创建一个新的命名空间).你可以试试一下
{ my $a = sub { print 1; }; $a->(); # works } $a->(); # fails
在这种情况下,子关键字不是创建一个sub并将其放在主命名空间中,而是创建一个匿名子例程并将其存储在词法范围的变量中.当变量超出范围时,它不再可用(通常).
阅读更多退房perldoc perlsub
此外,您是否知道您可以检查Perl解析器查看代码的方式?使用标记-MO = Deparse运行perl,如perl -MO = Deparse yourscript.pl.您的原始代码解析为:
sub a { print 1; } {;}; a ;
对于Perl 6中的示例,请参阅:Success,Failure.请注意,在Perl 6中,取消引用.不 – >
编辑:我已经添加了another answer关于预期为Perl 5.18的词汇子程序的新的实验支持.