Perl 循环
-
循环
在某些情况下,您需要多次执行一个代码块。通常,语句是按顺序执行的:函数中的第一个语句首先执行,然后第二个执行,依此类推。编程语言提供了各种控制结构,允许更复杂的执行路径。循环语句使我们可以多次执行一个语句或一组语句,以下是大多数编程语言中循环语句的一般形式-Perl编程语言提供了以下类型的循环来处理循环需求。循环类型 描述 while循环 在给定条件为真时重复一个语句或一组语句。它在执行循环体之前测试条件。 until循环 重复一个语句或一组语句,直到给定条件变为真为止。它在执行循环体之前测试条件。 for循环 多次执行一系列语句,并简化管理循环变量的代码。 foreach 循环 foreach循环遍历常规列表值,并将变量var 依次设置为列表的每个元素。 do... while循环 它更像while语句,除了它在循环主体的末尾测试条件(do...while循环至少会执行一次)。 嵌套循环 您可以在任何其他while,for或do..while循环内使用一个或多个循环。 -
while循环
语法:while(condition) { statement(s); }
流程图:这里,要注意的关键是,while循环可能根本不执行。当测试条件第一次并且结果为false时,将跳过循环主体,并执行while循环之后的第一条语句。范例:
尝试一下$a = 10; # while loop execution while( $a < 20 ) { printf "Value of a: $a\n"; $a = $a + 1; }
在这里,我们使用比较运算符 < 将变量$a的值与20进行比较。因此,尽管$ a的值小于20,而while循环继续执行它下面的代码块,并且一旦$a的值变为等于20,就跳出循环。 -
until 循环
只要给定条件为假,Perl 编程语言中的 until 循环语句就会重复执行目标语句。语法:until(condition) { statement(s); }
此处的 statement(s) 可以是单个语句或语句块。所述条件可以是任何表达。循环迭代直到条件变为真。当条件变为真时,程序控制传递到紧随循环的那一行。在布尔上下文中,数字0,字符串'0'和"",空列表()和undef均为false,其他所有值均为true。否定真值!或不返回特殊的false值。until 循环的关键点在于该循环可能永远不会运行。当条件被测试并且结果为true时,将跳过循环体,并执行直到循环之后的第一条语句。范例:
尝试一下$a = 5; # until loop execution until( $a > 10 ) { printf "Value of a: $a\n"; $a = $a + 1; }
在这里,我们使用比较运算符 > 将变量$a的值与10进行比较。因此,直到$a的值小于10,直到循环继续执行它旁边的代码块以及$a的值为止变得大于10,就跳出循环。 -
for循环
语法:for ( init; condition; increment ) { statement(s); }
这是“for”循环中的控制流程-- init步骤首先被执行,并且只有一次。此步骤允许您声明和初始化任何循环控制变量。
- 接下来,测试condition。如果为true,则执行循环主体。如果为假,则不执行循环主体,并且控制流仅在“for”循环之后跳转到下一条语句。
- 在“for”循环的主体执行之后,控制流跳回到increment语句。该语句允许您更新任何循环控制变量。
- 现在将再次测试condition。如果为true,则循环执行并重复执行过程(循环主体,然后是递增步,然后再次是条件)。条件变为假之后,“for”循环终止。
流程图:范例:
尝试一下# for loop execution for( $a = 10; $a < 20; $a = $a + 1 ) { print "value of a: $a\n"; }
-
foreach 循环
语法:foreach var (list) { ... }
范例:
尝试一下@list = (2, 20, 30, 40, 50); # foreach loop execution foreach $a (@list) { print "value of a: $a\n"; }
-
do...while循环
与for和while循环不同,for和while循环在循环的顶部测试循环条件,而C语言中的do ... while循环在循环的底部检查其条件。do...while循环类似于while循环,但事实上,它是保证执行至少一次。语法:do { statement(s); }while( condition );
应当注意,条件表达式出现在循环的末尾,因此循环中的语句在测试条件之前执行一次。如果条件为真,则控制流将跳回去执行,并且循环中的语句将再次执行。重复此过程,直到给定条件变为假。在布尔上下文中,数字0,字符串'0'和"",空列表()和undef均为false,其他所有值均为true。否定真值!或不返回特殊的false值。流程图:范例:
尝试一下$a = 10; # do...while loop execution do{ printf "Value of a: $a\n"; $a = $a + 1; }while( $a < 20 );
-
嵌套循环
Perl 允许在另一个循环中使用一个循环。以下部分显示了一些示例来说明这一概念。C中嵌套的for循环语句的语法如下-:for ( init; condition; increment ) { for ( init; condition; increment ) { statement(s); } statement(s); }
Perl 语言中的嵌套while循环语句的语法如下-:while(condition) { while(condition) { statement(s); } statement(s); }
Perl 语言中嵌套do ... while循环语句的语法如下-:do{ statement(s); do{ statement(s); }while( condition ); }while( condition );
Perl 语言中嵌套until循环语句的语法如下-:until(condition) { until(condition) { statement(s); } statement(s); }
Perl 语言中嵌套 foreach 循环语句的语法如下-:foreach $a (@listA) { foreach $b (@listB) { statement(s); } statement(s); }
关于循环嵌套的最后一点是您可以将任何类型的循环放入任何其他类型的循环中。例如,“for”循环可以在“while”循环内,反之亦然。范例:
尝试一下$a = 0; $b = 0; # outer while loop while($a < 3) { $b = 0; # inner while loop while( $b < 3 ) { print "value of a = $a, b = $b\n"; $b = $b + 1; } $a = $a + 1; print "Value of a = $a\n\n"; }
-
循环控制语句
循环控制语句从其正常顺序更改执行。当执行离开作用域时,在该作用域中创建的所有自动对象都将被销毁。C支持以下控制语句。控制声明 描述 next 声明 使循环跳过其其余部分,并在重新进行迭代之前立即重新测试其状况。 last 声明 终止循环语句,并在循环之后立即将执行转移到该语句。 redo 声明 redo 命令重新启动循环块,而无需再次评估条件。如果执行continue块,则不执行。 continue声明 始终在条件将要再次评估之前执行。 goto声明 Perl支持三种形式的goto命令:goto 标签,goto expr和goto &name。 -
next 声明
Perl next语句开始循环的下一个迭代。您可以为LABEL提供下一条语句,其中LABEL是循环的标签。一个下一个语句可以嵌套的循环,如果未指定标签是这将是适用于最近的循环中被使用。如果循环上存在一个continue块,则始终在要评估条件之前执行该块。语法:next [ LABEL ];
方括号内的LABEL表示LABEL是可选的,如果未指定LABEL,则next语句会将控件跳转到最近的循环的下一个迭代。范例:
尝试一下$a = 10; while( $a < 20 ) { if( $a == 15) { # skip the iteration. $a = $a + 1; next; } print "value of a: $a\n"; $a = $a + 1; }
-
last 声明
当在循环内遇到 last 语句时,循环立即终止,程序控制在循环后的下一个语句处恢复。您可以为LABEL提供最后一个语句,其中LABEL是循环的标签。一个最后的语句可以嵌套的循环,如果未指定标签是这将是适用于最近的循环中被使用。如果循环上有任何 continue 块,则不会执行。语法:last [LABEL];
方括号内的LABEL表示LABEL是可选的,如果未指定LABEL,则next语句会将控件跳转到最近的循环的下一个迭代。范例:
尝试一下$a = 10; while( $a < 20 ) { if( $a == 15) { # terminate the loop. $a = $a + 1; last; } print "value of a: $a\n"; $a = $a + 1; }
范例2:让我们举一个例子,我们将在下一条语句中使用LABEL-
尝试一下$a = 0; OUTER: while( $a < 4 ) { $b = 0; print "value of a: $a\n"; INNER:while ( $b < 4) { if( $a == 2) { # terminate outer loop last OUTER; } $b = $b + 1; print "Value of b : $b\n"; } print "\n"; $a = $a + 1; }
-
continue声明
Perl 中的continue语句始终执行之前的条件将要被重新评估。可以将while语句与while和foreach循环一起使用。连续语句也可以与代码块一起单独使用,在这种情况下,它将被假定为流控制语句而不是函数。语法:带while循环的continue语句的语法如下-while(condition) { statement(s); } continue { statement(s); }
语法带foreach循环的continue语句的语法如下-foreach $a (@listA) { statement(s); } continue { statement(s); }
语法 continue 块的语法如下-continue { statement(s); }
范例:以下程序使用while循环模拟for循环-
尝试一下$a = 0; while($a < 3) { print "Value of a = $a\n"; } continue { $a = $a + 1; }
范例以下程序显示了foreach循环对continue语句的用法-
尝试一下@list = (1, 2, 3, 4, 5); foreach $a (@list) { print "Value of a = $a\n"; } continue { last if $a == 4; }
-
continue声明
redo 命令重新启动循环块,而无需再次评价以下条件。您可以为LABEL提供 redo 语句,其中LABEL是循环的标签。一个 redo 语句可以嵌套的循环,如果未指定标签是这将是适用于最近的循环中被使用。如果循环上有任何continue块,则在评估条件之前将不执行它。语法redo [LABEL]
范例
尝试一下$a = 0; while($a < 10) { if( $a == 5 ) { $a = $a + 1; redo; } print "Value of a = $a\n"; } continue { $a = $a + 1; }
-
goto声明
Perl确实支持goto语句。 共有三种形式:goto LABEL,goto EXPR和goto &NAME。- goto LABEL - goto LABEL表单跳转到标有LABEL的语句,并从此处继续执行。
- goto EXPR - goto EXPR形式只是goto LABEL的概括。它期望表达式返回标签名称,然后跳转到该标签语句。
- goto &NAME - 它将对当前运行的子例程的调用替换为命名子例程。
语法:goto LABEL or goto EXPR or goto &NAME
流程图:范例:
尝试一下$a = 10; LOOP:do { if( $a == 15) { # skip the iteration. $a = $a + 1; # use goto LABEL form goto LOOP; } print "Value of a = $a\n"; $a = $a + 1; } while( $a < 20 );
范例:以下示例显示了goto EXPR表单的用法。在这里,我们使用两个字符串,然后使用字符串串联运算符(.)对其进行串联。最后,它形成标签,并使用goto跳转到标签-
尝试一下$a = 10; $str1 = "LO"; $str2 = "OP"; LOOP:do { if( $a == 15) { # skip the iteration. $a = $a + 1; # use goto EXPR form goto $str1.$str2; } print "Value of a = $a\n"; $a = $a + 1; } while( $a < 20 );
-
无限循环
如果条件永远不会为假,则循环将变成无限循环。传统上,for循环用于此目的。“for”循环的三个表达式不是必需的,因此可以通过将条件表达式保留为空来进行无限循环。for( ; ; ) { printf "这里将永远执行.\n"; }
当条件表达式不存在时,假定它为真。您可能有一个初始化和增量表达式,但是C程序员更经常使用for(;;)构造来表示一个无限循环。while循环可以指定条件为true永远循环while( true ) { printf("这里将永远执行.\n"); }
注意 -您可以通过按Ctrl + C键终止无限循环。