Perl "my $bar if 0;" 与 "my $bar = undef if 0;"

Perl "my $bar if 0;" vs "my $bar = undef if 0;"

下面的代码会return出错,

$ perl -E'sub foo { my $bar if 0; $bar++ }'
This use of my() in false conditional is no longer allowed at -e line 1.

但是这段代码

$ perl -E'sub foo { my $bar = undef if 0; $bar++ }'

没有return错误。这两种形式有什么区别吗?

my 具有 compile-time 效果和 run-time 效果,您不想在没有 [=24= 的情况下使用 my 变量]效果。

由于问题情况是在与声明不同的条件下使用 my 变量,因此您的两个代码段之间没有区别。两者都应避免。

要创建子范围内的持久变量,您可以使用

{
   my $bar = 0;
   sub foo {
      return $bar++;
   }
}

use feature qw( state );  # 5.10+

sub foo {
   state $bar = 0;
   return $bar++;
}