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-код.
Кроме того, это выглядит как настраиваемый параметр
Это может показаться не таким уж большим делом, пока вы не увидите такой код
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);
}
что не позволит вам прибыть вовремя на ужин с семьей, потому что велосипед $ вне петли не изменяется петлей. Возможно, вы разблокировали свой велосипед, но не можете вспомнить, какой он был.