在Perl教程本小节,我们来看看Perl里的while循环怎么工作。
use strict;
use warnings;
use 5.010;
my $counter = 10;
while ($counter > 0) {
say $counter;
$counter -= 2;
}
say 'done';
while
循环有个条件判断,本例中是检查变量$counter是否大于0,然后执行大括号里包含的代码段。
当while循环首次开始执行时,它检查条件是真或假。
如果是假
,代码块就会被跳过,并执行下一条语句,我们这里是打印出'done'。
如果while
的条件是真
,代码块将会执行,之后重新回到条件判断并再次评估条件。
如果条件为假,代码块被跳过并打印'done'。如果条件为真,代码块被执行然后重新回到条件判断……
只要条件为真,这就一直执行下去就像英语语句:
while (条件为真) { 做某事 }
无限循环
在上面的代码里,我们一直减少变量,所以最终条件会变成假。
但由于某种原因,条件永远不可能为假,你就碰到了无限循环
。你的程序会陷入一个很小的代码块并永远走不出来。
比如我们忘记了减少变量$counter
,或者我们在增加它的同时却依然去检查一个很小的边界。
如果这只是失误引起,那它就是个缺陷。
另外,有时故意使用无限循环可以让我们的程序写起来更简单易读。我们喜欢可读性强的代码! 如果我们相使用无限循环,我们可以使用一个永远为真的条件。
因此我们可以写:
while (42) {
# here we do something
}
当然,你如果缺少 必要的文化背景 可能会疑惑,为啥经常使用42。虽然枯燥的方式是在无限循环里总是使用数字1。
while (1) {
# here we do something
}
很自然,看起来这段代码永远不可能跳出循环,你可能会疑惑不从外部终止的话,它怎么能执行结束?
这有很多办法。
其中之一是在while循环里使用last
声明。
这会跳出剩下的代码块而且不去重新检查条件。
人们也通常通过加入某种条件判断,有效地终止循环。
use strict;
use warnings;
use 5.010;
while (1) {
print "Which programming language are you learning now? ";
my $name = <STDIN>;
chomp $name;
if ($name eq 'Perl') {
last;
}
say 'Wrong! Try again!';
}
say 'done';
这个例子中,我们问用户一个问题并希望他使用正确的大小写来回答。如果没有输入'Perl',他将永远被这个问题绊住。 所以,对话可能像这样进行:
Which programming language are you learning now?
> Java
Wrong! Try again!
Which programming language are you learning now?
> PHP
Wrong! Try again!
Which programming language are you learning now?
> Perl
done
如你所见,一旦用户输入正确的答案,last
将会被调用,剩下的代码块包括say 'Wrong! Try again!';
将会被跳过,程序会跳过
while循环
继续执行。