3

以下代码将返回错误,

$ 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++ }'

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

4

1 回答 1

7

my具有编译时效果和运行时效果,您不想在my没有运行时效果的情况下使用变量。

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

要创建一个作用域为 sub 的持久变量,您可以使用

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

或者

use feature qw( state );  # 5.10+

sub foo {
   state $bar = 0;
   return $bar++;
}
于 2020-09-23T23:18:43.963 回答