在学习Perl的同时,我尝试创建一个记住以前值的函数时遇到了这个问题。
代码:
use strict;
use warnings;
sub running_sum {
state $sum;
state (@numbers);
foreach my $number (@_) {
push @numbers, $number;
$sum += $number;
}
$sum;
}
print running_sum(1..2);
print running_sum(3..5);
当我尝试运行它时,我收到了这个错误:
Global symbol "$sum" requires explicit package name (did you forget to declare "my $sum"?) at ../tmp.pl line 12.
Global symbol "@numbers" requires explicit package name (did you forget to declare "my @numbers"?) at ../tmp.pl line 13.
Global symbol "@numbers" requires explicit package name (did you forget to declare "my @numbers"?) at ../tmp.pl line 16.
Global symbol "$sum" requires explicit package name (did you forget to declare "my $sum"?) at ../tmp.pl line 17.
Global symbol "$sum" requires explicit package name (did you forget to declare "my $sum"?) at ../tmp.pl line 20.
如果我添加use feature 'state';
,该功能运行良好,不会抛出任何错误;但是从我从5.10读到的内容应该始终启用(我使用的是Perl v5.22.1)。
我的翻译或代码可能有些奇怪,或者这是预期的行为?
答案 0 :(得分:9)
这是预期的。必须明确启用引入新关键字的功能,以避免破坏可能已定义称为例如state
。
您可以使用use feature
声明启用功能,例如use v5.12.0
(需要至少perl版本的5.12.0并启用该版本中的所有功能)。