在5.10之前的Perl中没有"状态"声明.
我在这些Perls中遇到了一个创建静态变量的例子:my $x if 0.该if 0条件使变量的行为像一个静态变量:
use strict; use warnings;
add() for 1..7;
sub add {
my @arr = () if 0;
push @arr, '+';
print @arr, "\n";
}
Run Code Online (Sandbox Code Playgroud)
打印:
+
++
+++
++++
+++++
++++++
+++++++
Run Code Online (Sandbox Code Playgroud)
在5.10之前的所有版本的Perl中,这种行为是否一致?
Mic*_*man 15
行为my $x if 0是一个错误.它存活了很长时间,因为它有用并因此被使用; 修复它会破坏现有代码.它是一致的,因此可以被认为是可用的,但这并不意味着你应该这样做.此"功能"已弃用,并在5.10发出警告:
Deprecated use of my() in false conditional
Run Code Online (Sandbox Code Playgroud)
即使你不能使用state(即你的代码需要能够在5.10之前的Perl版本下运行),my $x if 0诀窍就是懒惰.否则使用封闭:
{
my $x;
sub counter {
$x = '1' unless defined $x;
print $x++, "\n";
}
}
Run Code Online (Sandbox Code Playgroud)
FMc*_*FMc 14
我总是使用作用域括号来创建静态变量.
add() for 1..2; # Append to existing.
add('foo', 'bar'); # Re-initialize if args are passed.
add() for 1..2; # Append to existing.
{
my @arr;
sub add {
@arr = @_ if @_;
push @arr, '+';
print @arr, "\n";
}
}
Run Code Online (Sandbox Code Playgroud)
不,这非常糟糕.改为使用闭包.
use strict;
sub add {
my @arr;
return sub {
push @arr, '+';
print @arr, "\n";
}
}
my $iter = add();
$iter->() for 1..7;
Run Code Online (Sandbox Code Playgroud)