2016-03-31 5 views
0

У меня есть этот кодPerl + PerlCritic | петля итератор не лексическое

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

После perlcritic проверки, я получаю messsage «Loop итератор не лексический.» Что не так?

я могу использовать

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

, но почему? :)

ответ

5

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

Кроме того, this looks like a configurable option

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

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