Eva*_*oll 3 perl variable-initialization variable-declaration
以下代码将返回错误,
$ perl -E'sub foo { my $bar if 0; $bar++ }'
This use of my() in false conditional is no longer allowed at -e line 1.
Run Code Online (Sandbox Code Playgroud)
但是这段代码
$ perl -E'sub foo { my $bar = undef if 0; $bar++ }'
Run Code Online (Sandbox Code Playgroud)
不返回错误。这两种形式有什么区别吗?
my具有编译时效果和运行时效果,并且您不想在my没有首先具有运行时效果的情况下使用变量。
由于有问题的情况是my在与声明不同的条件下使用变量,因此您的两个代码段之间没有区别。两者都应该避免。
要创建作用域为子的持久变量,您可以使用
{
my $bar = 0;
sub foo {
return $bar++;
}
}
Run Code Online (Sandbox Code Playgroud)
或者
use feature qw( state ); # 5.10+
sub foo {
state $bar = 0;
return $bar++;
}
Run Code Online (Sandbox Code Playgroud)