Perl + PerlCritic | Итератор цикла не лексический

У меня есть этот код

...
    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 ответа

Решение

Похоже, PerlCritic хочет, чтобы переменная цикла имела только область видимости цикла, то есть не существовала после окончания цикла. Это может считаться чрезмерно пуристским / педантичным, но я склонен согласиться и обычно так же пишу свой Perl-код.

Кроме того, это выглядит как настраиваемый параметр

Из cpan http://search.cpan.org/dist/Perl-Critic/lib/Perl/Critic/Policy/Variables/RequireLexicalLoopIterators.pm!

Это может показаться не таким уж большим делом, пока вы не увидите такой код

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);
}

что не позволит вам прибыть вовремя на ужин с семьей, потому что велосипед $ вне петли не изменяется петлей. Возможно, вы разблокировали свой велосипед, но не можете вспомнить, какой он был.

Другие вопросы по тегам