Perl + PerlCritic |循环迭代器不是词法

时间:2016-03-31 05:43:55

标签: perl perl-critic

我有这段代码

...
    my $line = '';
        foreach $line ( split( /\n/x, $raw ) ) {
            chomp $line;
            my ( $key, $val ) = split( /=/x, $line );
            $param{$key} = $val;
        }
...

在perlcritic检查后,我得到了一些消息“循环迭代器不是词法。” 怎么了?

我可以用

 #my $line = '';
            foreach my $line ( split( /\n/x, $raw ) )

但为什么呢? :)

2 个答案:

答案 0 :(得分:5)

看起来PerlCritic希望循环变量只有循环范围,即在循环结束后不存在。这可能被认为过于纯粹主义/迂腐,但我倾向于同意,并且通常也以这种方式编写我的Perl代码。

此外,this looks like a configurable option

答案 1 :(得分:3)

来自cpan Perl::Critic::Policy::Variables::RequireLexicalLoopIterators

  

在看到像

之类的代码之前,这似乎不是什么大问题
my $bicycle;
for $bicycle (@things_attached_to_the_bike_rack) {
    if (
            $bicycle->is_red()
        and $bicycle->has_baseball_card_in_spokes()
        and $bicycle->has_bent_kickstand()
    ) {
        $bicycle->remove_lock();

        last;
    }
}

if ( $bicycle and $bicycle->is_unlocked() ) {
    ride_home($bicycle);
}
  

这不会让你及时赶到与家人共进晚餐,因为循环外的$自行车没有改变。你可能已经解锁了自行车,但你不记得它是哪一辆。