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?
答案 0 :(得分:9)
您正在利用一个奇怪的错误(officially deprecated并计划在5.30中成为致命错误),其中包括在语句中声明一个词法(my
)变量-modifier conditional是错误的。
发生这种情况的原因是my $bar = 1;
基本上有两个函数。它有一个编译时函数,用于在变量的词法填充中保留空间,并将$bar
与该空间相关联;它有一个运行时函数,只要控制流到达1
语句就会将$bar
分配给my
(my $foo;
之类的语句没有赋值也有这些两个效果,除了它在运行时分配undef
。
当您使用my $bar = 1 if 1 == 2;
之类的错误条件来管理语句时,编译时函数保持完全相同,但运行时函数是阻止使用false条件运行,这意味着重新使用该存储中的任何值,而不是每次代码到达该点时都被赋予新的值。这几乎可以产生效果,但不完全像使用state
变量一样。这是一个很酷的技巧,但不建议用于任何严肃的用途,正如我所提到的,它将在即将发布的perl版本中致命,这是不依赖它的另一个原因。
答案 1 :(得分:6)
永远不要将my
与语句修饰符一起使用。此类构造的行为是未定义(请参阅perlsyn)。
当前的实现并没有清除在子程序的上一次运行中赋给变量的值,但是不能保证行为将保持不变(实际上,它不会: perldeprecation)。