2016-03-31 28 views
0

我有這樣的代碼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)) 

但爲什麼呢? :)

回答

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

它是不會讓你時刻與您的家人到達吃飯,因爲$自行車循環外部不會被循環改變。你可能已經解鎖了你的自行車,但你不記得它是哪一個。