我有一个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";
}
我想知道为什么第一个循环不起作用!
答案 0 :(得分:9)
来自Perl manual on the foreach
construct:
foreach循环遍历a 正常列表值并设置 变量VAR是每个元素的 依次列出。如果变量是 之前是关键字my,然后是它 是词法范围的,因此 仅在循环内可见。 否则,变量是隐式的 循环本地并重新获得它 退出循环时的前值。
答案 1 :(得分:2)
foreach my ...
中变量的范围是foreach
循环本身。来自perldoc perlsyn
:
有一个小的区别:如果变量是用
my
声明的for
的初始化部分,它们的词法范围 变量恰好是for
循环(循环体和循环体) 控制部分)。