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/