Perl 循环
最后修改于 2023 年 8 月 24 日
在本文中,我们将介绍如何在 Perl 中创建循环。
循环是一系列不断重复的指令,直到达到某个特定条件。例如,我们有一个项目集合,并创建一个循环来遍历该集合的所有元素。
在 Perl 中,我们使用 for
、while
和 until
关键字来定义循环。last
、next
和 redo
语句用于修改循环的行为。
Perl while 循环
while 循环是一种控制流语句,它允许基于给定的布尔条件重复执行代码。
while 关键字执行花括号内代码块中的语句。每次表达式求值为真时,都会执行这些语句。
#!/usr/bin/perl use 5.34.0; use warnings; my $sum = 0; my $i = 0; while ($i <= 10) { $sum += $i; $i++; } say $sum;
在此示例中,我们使用 while 循环对 1..10 的数字求和。
my $sum = 0; my $i = 0;
我们定义了 $sum
变量和 $i
计数器,用于控制循环。
while ($i <= 10) { .. }
由 {}
字符分隔的代码块内的语句在每次循环时都会执行。
$sum += $i; $i++;
我们将 $i
的当前值加到 $sum
变量中,并递增计数器。
$ ./main.pl 55
Perl do/while 循环
do/while
循环是 while
循环的一个小修改。在 do/while
循环中,语句在条件测试之前执行。这意味着语句至少会执行一次。
#!/usr/bin/perl use 5.34.0; use warnings; my $r = 0; do { $r = int rand(30); printf "$r "; } while ( $r != 22 ); print "\n";
在程序中,我们在每次循环中打印一个介于 0 和 30 之间的随机数。一旦随机值等于 22,循环就会终止。随机值使用 rand
函数生成。
$ ./main.pl 16 1 20 16 10 26 10 8 19 0 26 6 7 13 22 $ ./main.pl 1 11 4 29 6 13 22 $ ./main.pl 23 18 19 1 2 1 28 2 17 2 24 8 29 24 23 18 20 1 10 8 9 11 28 23 8 28 13 9 8 10 28 13 5 15 24 7 8 18 26 8 7 17 24 19 0 4 1 15 7 24 18 19 25 5 7 3 21 18 16 8 6 14 2 3 10 17 18 6 8 13 19 5 21 27 16 16 4 14 3 28 28 22 $ ./main.pl 18 13 17 20 11 15 22
Perl until 循环
与 while
类似,until
循环在方括号内的条件求值为假时执行。也就是说,一旦条件为真,它就会终止。
use 5.34.0; use warnings; my $r = 0; until ( $r == 22 ) { $r = int rand(30); printf "$r "; } print "\n";
我们使用 until
循环生成一堆随机值。循环执行直到随机值不等于 22。
$ ./main.pl 2 14 28 6 12 5 6 14 17 21 17 13 22
Perl 经典 for 循环
Perl 支持 C 编程语言中的经典 for 循环。for 循环也有三个阶段:初始化、条件和代码块执行以及增量。
#!/usr/bin/perl use 5.34.0; use warnings; my $sum = 0; for ( my $i = 0 ; $i <= 10 ; $i++ ) { $sum += $i; } say $sum; $sum = 0; for ( my $i = 10 ; $i >= 0 ; $i-- ) { $sum += $i; } say $sum;
在程序中,我们创建了两个 for 循环来对 1..10 的值求和。
for ( my $i = 0 ; $i <= 10 ; $i++ ) { $sum += $i; }
在第一阶段,我们将计数器 $i
初始化为零。此阶段只执行一次。接下来是条件 $i
< 10。如果满足条件,则执行 for 代码块内的语句。在第三阶段,计数器会增加。现在我们重复第 2、3 阶段,直到条件不满足并且 for 循环退出。在我们的例子中,当计数器 $i
等于 10 时,for 循环停止执行。
for ( my $i = 10 ; $i >= 0 ; $i-- ) { $sum += $i; }
这是另一个 for 循环。它的作用相同。有一个小区别:我们对 10..1 的值求和。
$ ./main.pl 55 55
Perl foreach 循环
foreach 循环用于遍历数据集合。它没有显式的计数器。foreach 关键字逐个遍历集合,并将当前值复制到构造中定义的临时变量。
在 Perl 中,我们可以使用 for
和 foreach
关键字。它们是同义词。
#!/usr/bin/perl use 5.34.0; use warnings; my @vals = ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ); foreach my $val (@vals) { say $val if $val % 2 == 0; } say '------------------------------'; for my $val (@vals) { say $val if $val % 2 != 0; }
在程序中,我们有两个 foreach 循环。
my @vals = ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 );
我们定义了一个值数组。
foreach my $val (@vals) { say $val if $val % 2 == 0; }
在第一个循环中,我们遍历数组并打印每个偶数值。$val
变量是一个临时变量,它保存了容器中的当前值。
for my $val (@vals) { say $val if $val % 2 != 0; }
在第二个循环中,我们打印每个奇数值。for
和 foreach
关键字可以互换使用。
$ ./main.pl 55 55
Perl 有 for 循环的简写形式。
#!/usr/bin/perl use 5.34.0; use warnings; my @vals = 1..10; for (@vals) { say $_; } say '---------------------------------'; for (@vals) { say; }
在此示例中,我们创建了两个简短的 for 循环,它们遍历整数范围。$_
是默认的迭代器变量。如果省略,则假定使用它。
$ ./main.pl 1 2 3 4 5 6 7 8 9 10 --------------------------------- 1 2 3 4 5 6 7 8 9 10
Perl last 语句
last
语句用于立即退出循环。
#!/usr/bin/perl use 5.34.0; use warnings; my $r = 0; while (1) { $r = int rand(30); printf "$r "; last if ( $r == 22 ); } print "\n";
在此示例中,我们创建了一个无限 while 循环。在循环内部,我们生成随机整数。当随机值为 22 时,使用 last
语句终止循环。
$ ./main.pl 9 16 23 20 0 7 20 29 20 20 29 25 20 10 6 17 2 22
Perl next 语句
next
启动循环的下一次迭代。它不像 last
那样终止循环。它只启动一个新循环并跳过 next
后面的代码。
#!/usr/bin/perl use 5.34.0; use warnings; my $n = 0; while ( $n < 1000 ) { $n++; if ( ( $n % 2 ) == 0 ) { next; } print("$n "); } print("\n");
在程序中,我们打印从 1 到 1000 的所有奇数值。
if ( ( $n % 2 ) == 0 ) { next; }
如果该值为奇数,则执行 next
语句;因此该值不会被打印。
$ ./main.pl 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35...
Perl redo 语句
redo
重新启动循环块,而无需再次评估条件。
#!/usr/bin/perl use 5.34.0; use warnings; my $i = 0; my $sum = 0; while ($i < 5) { my $r = int rand(10); $sum += $r; $i++; redo if ($sum < 20); } say "$sum $i";
在此示例中,我们生成至少五个介于 1 和 10 之间的随机值。使用 redo
语句,我们确保总和始终大于或等于 20。
列出 Perl 文件
在下一个示例中,我们使用循环列出所有 Perl 文件。
#!/usr/bin/perl use 5.34.0; use warnings; my @files = glob('*.pl'); say $_ for (@files);
使用 glbo
函数,我们找出所有扩展名为 .pl
的文件。该函数返回一个文件名数组。通过 for 循环,我们遍历数组并将每个文件名打印到终端。
在本文中,我们展示了如何在 Perl 中创建循环。
作者
列出 所有 Perl 教程。