Perl是否不是词法范围的设计缺陷?

前端之家收集整理的这篇文章主要介绍了Perl是否不是词法范围的设计缺陷?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
{
  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的词汇子程序的新的实验支持.

猜你在找的Perl相关文章