perl - 有人可以解释这个 perl 片段吗?

标签 perl

for my $n (1, 2) {
  sub_example();
}

sub sub_example {
  my $bar = 1 if 1 == 2;
  if ($bar) {
     print "hahha, you see\n";
  }
  else {
     $bar = 1;
  }
}

所以我的问题是为什么要在第二次循环迭代中定义 $bar?

最佳答案

您正在利用一个奇怪的错误(officially deprecated 并将在 5.30 中成为 fatal error ),它涉及在语句中声明词法(my)变量,条件语句修饰符为假.

发生这种情况的原因是因为 my $bar = 1;基本上有两个功能。它有一个编译时功能,就是在词法填充区为变量预留空间,并关联$bar。有了那个空间;它有一个运行时函数,就是赋值1$bar每当控制流到达 my语句(像 my $foo; 一样没有赋值的语句也有这两种效果,除了它在运行时赋值 undef)。

当您使用类似 my $bar = 1 if 1 == 2; 的错误条件来管理语句时, compile-time 函数保持完全相同,但 run-time 函数被阻止使用 false 条件运行,这意味着该存储中的任何值都是重新使用,每次代码到达该点时都不会重新分配。这几乎(但不完全)产生了一种效果,就像使用 state 一样。多变的。这是一个很酷的技巧,但不推荐用于任何正式用途,正如我所提到的,它将在即将发布的 perl 版本中失效,这是不依赖它的另一个原因。

关于perl - 有人可以解释这个 perl 片段吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50696216/

相关文章:

windows - 当 Cygwin 的 Perl 启动带有反引号的程序时,无法触发系统调试器转储核心

perl - Perl CGI 模块的基本帮助

arrays - 多次迭代一个文件,每次查找一个正则表达式并返回一行(perl)

regex - Perl:删除较长字符串中的首字母缩略词连字符

perl - 防止 SQL 表名注入(inject) - 多远?

perl - 将 perl 变量发送到命令并捕获输出

java - 从 Java 调用 "interactive"Perl 脚本

bash - 将数据从一个来源迁移到另一个来源的脚本

perl - 什么是强制 Perl 5 在 OS X 上快速耗尽内存的好方法?

regex - Perl 匹配输入中的下一个