Perl "我的 $bar if 0;" vs "我的 $bar = undef if 0;"

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)

不返回错误。这两种形式有什么区别吗?

ike*_*ami 7

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)