2011-03-22 83 views
1

我有一个perl作用域问题。PERL在foreach循环中的作用域

use strict; 
use warnings; 

our @cycles = (0,1,2,3,4); 

foreach my $cycle (@cycles){ 
    my $nextcycle = 0; 
    foreach $nextcycle (@cycles){ 
     if ($cycle+1 == $nextcycle){ 
      print "found cycle+1, $nextcycle\n"; 
      last; 
     } 
    } 
    print "current=$cycle, nextcycle=$nextcycle\n"; 
} 

输出I得到:

发现周期+ 1,1

电流= 0,nextcycle = 0

发现周期+ 1,2

电流= 1,nextcycle = 0

found cycle + 1,3

电流= 2,nextcycle = 0

发现周期+ 1,4

电流= 3,nextcycle = 0

电流= 4,nextcycle = 0

我预计此:

找到周期+ 1,1

电流= 0,nextcycle = 1

发现周期+ 1,2

电流= 1,nextcycle = 2

发现周期+ 1,3

电流= 2,nextcycle = 3

发现周期+ 1,4

电流= 3,nextcycle = 4

电流= 4,nextcycle = 0

我进一步修改循环看起来像这一点,得到了我想要的东西:

use strict; 
use warnings; 

our @cycles = (0,1,2,3,4); 

foreach my $cycle (@cycles){ 
    my $nextcycle = 0; 
    foreach my $tempcycle (@cycles){ 
     if ($cycle+1 == $tempcycle){ 
      $nextcycle = $tempcycle; 
      print "found cycle+1, $nextcycle\n"; 
      last; 
     } 
    } 
    print "current=$cycle, nextcycle=$nextcycle\n"; 
} 

我想知道为什么第一个循环没有工作!

+0

[Perl的foreach循环的默认范围是什么?](http://stackoverflow.com/questions/2238576/what-is-the-default-scope-of-foreach-loop-在-perl的) – mob 2011-03-22 22:42:13

回答

2

foreach my ...中变量的范围是foreach循环本身。从perldoc perlsyn

有一个微小的差别:如果变量在 宣布与myfor的初始化部分,这些 变量的词汇范围,是完全for循环(循环和体 控制部分)。

9

Perl manual on the foreach construct

在 正常列表值foreach循环迭代并设置 变量VAR是 列表反过来的每个元素。如果变量是 前面是关键字my,那么它 是词汇范围的,因此 仅在循环内可见。 否则,该变量隐式地为 局部于循环,并在退出循环时重新获得其前值。