Perl 循环


Perl 循环

有的时候,我们可能需要多次执行同一块代码。一般情况下,语句是按顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。
编程语言提供了更为复杂执行路径的多种控制结构。
循环语句允许我们多次执行一个语句或语句组,下面是大多数编程语言中循环语句的流程图:

注意,数字 0, 字符串 '0' 、 "" , 空 list () , 和 undef 为 false ,其他值均为 true。 true 前面使用 ! 或 not则返回 false 。

Perl 语言提供了以下几种循环类型:

循环类型描述

while 循环

当给定条件为 true 时,重复执行语句或语句组。循环主体执行之前会先测试条件。

until 循环

重复执行语句或语句组,直到给定的条件为 true。 循环主体执行之前会先测试条件。

for 循环

多次执行一个语句序列,简化管理循环变量的代码。

foreach 循环

foreach 循环用于迭代一个列表或集合变量的值。

do...while 循环

除了它是在循环主体结尾测试条件外,其他与 while 语句类似。

嵌套循环

您可以在 while、for 或 do..while 循环内使用一个或多个循环。

Perl while 循环

while 语句在给定条件为 true 时,重复执行语句或语句组。循环主体执行之前会先测试条件。

语法

语法格式如下所示:

while(condition)
{
   statement(s);
}

在这里,statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块。condition 可以是任意的表达式,当为任意非零值时都为 true。当条件为 true 时执行循环。

当条件为 false 时,程序流将继续执行紧接着循环的下一条语句。

流程图

perl while

图表中,while 循环的关键点是循环可能一次都不会执行。当条件为 false 时,会跳过循环主体,直接执行紧接着 while 循环的下一条语句。

实例

#!/usr/bin/perl

$a = 10;

# 执行 while 循环
while( $a < 20 ){
   printf "a 的值为 : $a\n";
   $a = $a + 1;
}

程序中在变量 $a 小于 20 时执行循环体,在变量 $a 大于等于 20 时,退出循环。

执行以上程序,输出结果为:

a 的值为 : 10
a 的值为 : 11
a 的值为 : 12
a 的值为 : 13
a 的值为 : 14
a 的值为 : 15
a 的值为 : 16
a 的值为 : 17
a 的值为 : 18
a 的值为 : 19

Perl until 循环

until 语句在给定条件为 false 时,重复执行语句或语句组。

语法

语法格式如下所示:

until(condition)
{
   statement(s);
}

在这里,statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块。condition 可以是任意的表达式,当条件为 false 时执行循环。

当条件为 true 时,程序流将继续执行紧接着循环的下一条语句。

perl until

Perl 中的 until 循环

图表中,until 循环的关键点是循环可能一次都不会执行。当条件为 true 时,会跳过循环主体,直接执行紧接着 while 循环的下一条语句。

实例

#!/usr/bin/perl

$a = 5;

# 执行 until 循环
until( $a > 10 ){
   printf "a 的值为 : $a\n";
   $a = $a + 1;
}

程序中在变量 $a 小于 10 时执行循环体,在变量 $a 大于等于 10 时,退出循环。

执行以上程序,输出结果为:

a 的值为 : 5
a 的值为 : 6
a 的值为 : 7
a 的值为 : 8
a 的值为 : 9
a 的值为 : 10

Perl for 循环

Perl for 循环用于多次执行一个语句序列,简化管理循环变量的代码。

语法

语法格式如下所示:

for ( init; condition; increment ){
   statement(s);
}

下面是 for 循环的控制流程解析:

  1. init 会首先被执行,且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也可以不在这里写任何语句,只要有一个分号出现即可。
  2. 接下来,会判断 condition。如果为 true,则执行循环主体。如果为 false,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。
  3. 在执行完 for 循环主体后,控制流会跳回上面的 increment 语句。该语句允许您更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。
  4. 条件再次被判断。如果为 true,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。在条件变为 false 时,for 循环终止。

在这里,statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块。condition 可以是任意的表达式,当条件为 false 时执行循环。

当条件为 true 时,程序流将继续执行紧接着循环的下一条语句。

流程图

Perl for 循环

实例

#!/usr/bin/perl

# 执行 for 循环
for( $a = 0; $a < 10; $a = $a + 1 ){
    print "a 的值为: $a\n";
}

执行以上程序,输出结果为:

a 的值为: 0
a 的值为: 1
a 的值为: 2
a 的值为: 3
a 的值为: 4
a 的值为: 5
a 的值为: 6
a 的值为: 7
a 的值为: 8
a 的值为: 9

Perl foreach 循环

Perl foreach 循环用于迭代一个列表或集合变量的值。

语法

语法格式如下所示:

foreach var (list) {
...
}

流程图

Perl foreach 循环

实例

#!/usr/bin/perl

@list = (2, 12, 36, 42, 51);

# 执行foreach 循环
foreach $a (@list){
    print "a 的值为: $a\n";
}

执行以上程序,输出结果为:

a 的值为: 2
a 的值为: 12
a 的值为: 36
a 的值为: 42
a 的值为: 51

Perl do...while 循环

不像 for 和 while 循环,它们是在循环头部测试循环条件。在 Perl 语言中,do...while 循环是在循环的尾部检查它的条件。

do...while 循环与 while 循环类似,但是 do...while 循环会确保至少执行一次循环。

语法

语法格式如下所示:

do
{
   statement(s);
}while( condition );

请注意,条件表达式出现在循环的尾部,所以循环中的 statement(s) 会在条件被测试之前至少执行一次。

如果条件为 true,控制流会跳转回上面的 do,然后重新执行循环中的 statement(s)。这个过程会不断重复,直到给定条件变为 false 为止。

流程图

Perl do...while

实例

#!/usr/bin/perl

$a = 10;

# 执行 do...while 循环
do{
   printf "a 的值为: $a\n";
   $a = $a + 1;
}while( $a < 15 );

执行以上程序,输出结果为:

a 的值为: 10
a 的值为: 11
a 的值为: 12
a 的值为: 13
a 的值为: 14

Perl 循环嵌套

Perl 语言允许在一个循环内使用另一个循环,下面演示几个实例来说明这个概念。

语法

嵌套 for 循环语句的语法:

for ( init; condition; increment ){
   for ( init; condition; increment ){
      statement(s);
   }
   statement(s);
}

嵌套 while 循环语句的语法:

while(condition){
   while(condition){
      statement(s);
   }
   statement(s);
}

嵌套 do...while 循环语句的语法:

do{
   statement(s);
   do{
      statement(s);
   }while( condition );

}while( condition );

嵌套 until 循环语句的语法:

until(condition){
   until(condition){
      statement(s);
   }
   statement(s);
}

嵌套 foreach 循环语句的语法:

foreach $a (@listA){
   foreach $b (@listB){
      statement(s);
   }
   statement(s);
}

实例

#!/usr/bin/perl

$a = 0;
$b = 0;

# 外部循环
while($a < 3){
   $b = 0;
   # 内部循环
   while( $b < 3 ){
      print "a = $a, b = $b\n";
      $b = $b + 1;
   }
   $a = $a + 1;
   print "a = $a\n\n";
}

执行以上程序,输出结果为:

a = 0, b = 0
a = 0, b = 1
a = 0, b = 2
a = 1

a = 1, b = 0
a = 1, b = 1
a = 1, b = 2
a = 2

a = 2, b = 0
a = 2, b = 1
a = 2, b = 2
a = 3

循环控制语句

循环控制语句改变了代码的执行顺序,通过它你可以实现代码的跳转。
Perl 提供了下列的循环控制语句:

控制语句描述

next 语句

停止执行从next语句的下一语句开始到循环体结束标识符之间的语句,转去执行continue语句块,然后再返回到循环体的起始处开始执行下一次循环。

last 语句

退出循环语句块,从而结束循环

continue 语句

continue 语句块通常在条件语句再次判断前执行。

redo 语句

redo 语句直接转到循环体的第一行开始重复执行本次循环,redo语句之后的语句不再执行,continue语句块也不再执行;

goto 语句

Perl 有三种 goto 形式:got LABLE,goto EXPR,和 goto &NAME。

Perl next 语句

Perl next 语句用于停止执行从next语句的下一语句开始到循环体结束标识符之间的语句,转去执行continue语句块,然后再返回到循环体的起始处开始执行下一次循环。

语法

语法格式如下所示:

next [ LABEL ];

其中 LABEL 是可选的,如果没有指定 LABEL,next 语句将返回到循环体的起始处开始执行下一次循环。

实例

#!/usr/bin/perl

$a = 10;
while( $a < 20 ){
   if( $a == 15)
   {
       # 跳出迭代
       $a = $a + 1;
       next;
   }
   print "a 的值为: $a\n";
   $a = $a + 1;
}

执行以上程序,输出结果为:

a 的值为: 10
a 的值为: 11
a 的值为: 12
a 的值为: 13
a 的值为: 14
a 的值为: 16
a 的值为: 17
a 的值为: 18
a 的值为: 19

Perl last 语句

Perl last 语句用于退出循环语句块,从而结束循环,last语句之后的语句不再执行,continue语句块也不再执行。

语法

语法格式如下所示:

last [LABEL];

流程图

perl last

实例

#!/usr/bin/perl

$a = 10;
while( $a < 20 ){
   if( $a == 15)
   {
       # 退出循环
       $a = $a + 1;
       last;
   }
   print "a 的值为: $a\n";
   $a = $a + 1;
}

执行以上程序,输出结果为:

a 的值为: 10
a 的值为: 11
a 的值为: 12
a 的值为: 13
a 的值为: 14

Perl continue 语句

Perl continue 块通常在条件语句再次判断前执行。

continue 语句可用在 while 和 foreach 循环中。

语法

while 循环中 continue 语句语法格式如下所示:

while(condition){
   statement(s);
}continue{
   statement(s);
}

foreach 循环中 continue 语句语法格式如下所示:

foreach $a (@listA){
   statement(s);
}continue{
   statement(s);
}

实例

while 循环中使用 continue 语句:

#/usr/bin/perl

$a = 0;
while($a < 3){
   print "a = $a\n";
}continue{
   $a = $a + 1;
}

执行以上程序,输出结果为:

a = 0
a = 1
a = 2

foreach 循环中使用 continue 语句:

#/usr/bin/perl

@list = (1, 2, 3, 4, 5);
foreach $a (@list){
   print "a = $a\n";
}continue{
   last if $a == 4;
}

执行以上程序,输出结果为:

a = 1
a = 2
a = 3
a = 4

Perl redo 语句

Perl redo 语句直接转到循环体的第一行开始重复执行本次循环,redo语句之后的语句不再执行,continue语句块也不再执行。

continue 语句可用在 while 和 foreach 循环中。

语法

语法格式如下所示:

redo [LABEL]

其中 LABEL 是可选的。

带标号修饰符LABEL的redo语句表示把循环控制流程直接转到与标号修饰符LABEL相关联的语句块的第一行处开始执行,而不再执行redo语句之后的语句和continue语句块;

不带标号修饰符LABEL的redo语句表示把循环控制流程直接转到当前语句块的第一行处开始执行,而不再执行redo语句之后的语句和continue语句块;

如果是在for循环中或者是带有continue语句块,则for循环中的递增列表和continue语句块都不再被执行;

流程图

perl label

实例

#/usr/bin/perl

$a = 0;
while($a < 10){
   if( $a == 5 ){
      $a = $a + 1;
      redo;
   }
   print "a = $a\n";
}continue{
   $a = $a + 1;
}

执行以上程序,输出结果为:

a = 0
a = 1
a = 2
a = 3
a = 4
a = 6
a = 7
a = 8
a = 9

Perl goto 语句

Perl 有三种 goto 形式:got LABLE,goto EXPR,和 goto &NAME:

序号goto 类型
1goto LABEL

找出标记为 LABEL 的语句并且从那里重新执行。

2goto EXPR

goto EXPR 形式只是 goto LABEL 的一般形式。它期待表达式生成一个标记名称,并跳到该标记处执行。

3goto &NAME

它把正 在运行着的子进程替换为一个已命名子进程的调用。

语法

语法格式如下所示:

goto LABEL



goto EXPR



goto &NAME

流程图

Perl goto

实例

以下两个实例在变量 $a 为 15 时跳出输出。

以下是一个常用的 goto 实例:

#/usr/bin/perl

$a = 10;
LOOP:do
{
    if( $a == 15){
       # 跳过迭代
       $a = $a + 1;
       # 使用 goto LABEL 形式
       goto LOOP;
    }
    print "a = $a\n";
    $a = $a + 1;
}while( $a < 20 );

执行以上程序,输出结果为:

a = 10
a = 11
a = 12
a = 13
a = 14
a = 16
a = 17
a = 18
a = 19

以下实例使用了 goto EXPR形式。我们使用了两个字符串,并使用点号 (.) 来链接。

$a = 10;
$str1 = "LO";
$str2 = "OP";

LOOP:do
{
    if( $a == 15){
       # 跳过迭代
       $a = $a + 1;
       # 使用 goto EXPR 形式
       goto $str1.$str2;    # 类似 goto LOOP
    }
    print "a = $a\n";
    $a = $a + 1;
}while( $a < 20 );

执行以上程序,输出结果为:

a = 10
a = 11
a = 12
a = 13
a = 14
a = 16
a = 17
a = 18
a = 19

无限循环

如果条件永远不为 false,则循环将变成无限循环。
for 循环在传统意义上可用于实现无限循环。
由于构成循环的三个表达式中任何一个都不是必需的,您可以将某些条件表达式留空来构成一个无限循环。

实例

#!/usr/bin/perl

for( ; ; )
{
   printf "循环会无限执行。\n";
}

你可以按下 Ctrl + C 键来终止循环。
当条件表达式不存在时,它被假设为 true 。您也可以设置一个初始值和增量表达式,但是一般情况下,Perl 程序员偏向于使用 for(;;) 结构来表示一个无限循环。