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循环继续执行。