foreach循环中的PERL范围

时间:2011-03-22 22:14:36

标签: perl

我有一个perl范围问题。

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

我得到的输出:

  

发现周期+ 1,1

     

current = 0,nextcycle = 0

     

发现周期+ 1,2

     

current = 1,nextcycle = 0

     

发现周期+ 1,3

     

current = 2,nextcycle = 0

     

发现周期+ 1,4

     

current = 3,nextcycle = 0

     

current = 4,nextcycle = 0

我期待这个:

  

发现周期+ 1,1

     

current = 0,nextcycle = 1

     

发现周期+ 1,2

     

current = 1,nextcycle = 2

     

发现周期+ 1,3

     

current = 2,nextcycle = 3

     

发现周期+ 1,4

     

current = 3,nextcycle = 4

     

current = 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";
}

我想知道为什么第一个循环不起作用!

2 个答案:

答案 0 :(得分:9)

来自Perl manual on the foreach construct

  

foreach循环遍历a   正常列表值并设置   变量VAR是每个元素的   依次列出。如果变量是   之前是关键字my,然后是它   是词法范围的,因此   仅在循环内可见。   否则,变量是隐式的   循环本地并重新获得它   退出循环时的前值。

答案 1 :(得分:2)

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

  

有一个小的区别:如果变量是用my声明的   for的初始化部分,它们的词法范围   变量恰好是for循环(循环体和循环体)   控制部分)。