加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 21:41:54 所属栏目:大数据 来源:网络整理
导读:{ sub a { print 1; }}a; 一个bug,是吗 a不应该从外面提供. 它在Perl 6 *中工作吗? 对不起,我还没有安装 解决方法 你问为什么这个sub在块之外可见?如果是这样,那么因为编译时间子关键字将sub放在主命名空间中(除非你使用package关键字来创建一个新的命名空
{
  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的词汇子程序的新的实验支持.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读