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 教程。