perl - Perl subs 没有词法作用域是一个设计缺陷吗?

标签 perl scope raku

{
  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/

相关文章:

java - CDI 中的@ApplicationScoped 和@Singleton 范围有什么区别?

introspection - 从内部访问例程的捕获

grammar - 可以在Raku中编写NQP的优先级解析器

perl - 使用 DateTime::Format::Strptime 将字符串转换为日期

MongoDB/Perl : find_one doesn't return data after unrelated code

javascript - 正则表达式匹配模式 x 但返回任意字符串 y

vba - 在 VBA 中无法从工作簿事件处理程序 Workbook_BeforeClose 或 Workbook_Deactivate() 调用工作表中的子例程

javascript - 一种限制 JavaScript/CSS 范围的方法?

Perl(SSH 到远程主机,发出命令并关闭 session 而不等待其完成...)

raku - 如何基于逗号拆分字符串,但不基于双引号中的逗号