Perl - 为什么有必要指定使用' state'特征?

时间:2016-06-12 18:29:28

标签: perl

在学习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)。

我的翻译或代码可能有些奇怪,或者这是预期的行为?

1 个答案:

答案 0 :(得分:9)

这是预期的。必须明确启用引入新关键字的功能,以避免破坏可能已定义称为例如state

您可以使用use feature声明启用功能,例如use v5.12.0(需要至少perl版本的5.12.0并启用该版本中的所有功能)。

另请参阅perldoc featureperldoc -f use