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

时间:2018-06-05 09:03:57

标签: 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?

2 个答案:

答案 0 :(得分:9)

您正在利用一个奇怪的错误(officially deprecated并计划在5.30中成为致命错误),其中包括在语句中声明一个词法(my)变量-modifier conditional是错误的。

发生这种情况的原因是my $bar = 1;基本上有两个函数。它有一个编译时函数,用于在变量的词法填充中保留空间,并将$bar与该空间相关联;它有一个运行时函数,只要控制流到达1语句就会将$bar分配给mymy $foo;之类的语句没有赋值也有这些两个效果,除了它在运行时分配undef

当您使用my $bar = 1 if 1 == 2;之类的错误条件来管理语句时,编译时函数保持完全相同,但运行时函数是阻止使用false条件运行,这意味着重新使用该存储中的任何值,而不是每次代码到达该点时都被赋予新的值。这几乎可以产生效果,但不完全像使用state变量一样。这是一个很酷的技巧,但不建议用于任何严肃的用途,正如我所提到的,它将在即将发布的perl版本中致命,这是不依赖它的另一个原因。

答案 1 :(得分:6)

永远不要将my与语句修饰符一起使用。此类构造的行为是未定义(请参阅perlsyn)。

当前的实现并没有清除在子程序的上一次运行中赋给变量的值,但是不能保证行为将保持不变(实际上,它不会: perldeprecation)。