ZetCode

Perl 循环

最后修改于 2023 年 8 月 24 日

在本文中,我们将介绍如何在 Perl 中创建循环。

循环是一系列不断重复的指令,直到达到某个特定条件。例如,我们有一个项目集合,并创建一个循环来遍历该集合的所有元素。

在 Perl 中,我们使用 forwhileuntil 关键字来定义循环。lastnextredo 语句用于修改循环的行为。

Perl while 循环

while 循环是一种控制流语句,它允许基于给定的布尔条件重复执行代码。

while 关键字执行花括号内代码块中的语句。每次表达式求值为真时,都会执行这些语句。

main.pl
#!/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 循环中,语句在条件测试之前执行。这意味着语句至少会执行一次。

main.pl
#!/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 循环在方括号内的条件求值为假时执行。也就是说,一旦条件为真,它就会终止。

main.pl
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 循环也有三个阶段:初始化、条件和代码块执行以及增量。

main.pl
#!/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 中,我们可以使用 forforeach 关键字。它们是同义词。

main.pl
#!/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;
}

在第二个循环中,我们打印每个奇数值。forforeach 关键字可以互换使用。

$ ./main.pl
55
55

Perl 有 for 循环的简写形式。

mail.pl
#!/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 语句用于立即退出循环。

main.pl
#!/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 后面的代码。

main.pl
#!/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 重新启动循环块,而无需再次评估条件。

main.pl
#!/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 文件。

main.pl
#!/usr/bin/perl

use 5.34.0;
use warnings;

my @files = glob('*.pl');

say $_ for (@files);

使用 glbo 函数,我们找出所有扩展名为 .pl 的文件。该函数返回一个文件名数组。通过 for 循环,我们遍历数组并将每个文件名打印到终端。

在本文中,我们展示了如何在 Perl 中创建循环。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。到目前为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面有十多年的经验。

列出 所有 Perl 教程