在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";
}
打印:
+
++
+++
++++
+++++
++++++
+++++++
在5.10之前的所有版本的Perl中,这种行为是否一致?
答案 0 :(得分:15)
my $x if 0
的行为是一个错误。它存活了很长时间,因为它有用并因此被使用;修复它会破坏现有代码。它是一致的,因此可以被认为是可用的,但这并不意味着你应该这样做。此“功能”已弃用,并在5.10发出警告:
Deprecated use of my() in false conditional
即使您不能使用state
(即您的代码需要能够在5.10之前的Perl版本下运行),my $x if 0
技巧只是懒惰。否则使用封闭:
{
my $x;
sub counter {
$x = '1' unless defined $x;
print $x++, "\n";
}
}
答案 1 :(得分: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";
}
}
答案 2 :(得分:9)
不,这非常糟糕。改为使用闭包。
use strict;
sub add {
my @arr;
return sub {
push @arr, '+';
print @arr, "\n";
}
}
my $iter = add();
$iter->() for 1..7;