商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > Perl中的控制结构学习笔记

Perl中的控制结构学习笔记

  发布于2026-06-29 阅读(0)

扫一扫,手机访问

Perl的控制结构其实非常灵活,甚至有些“任性”。它不像C语言那样只有固定的几套招式,而是提供了多种姿势让你搞定条件判断和循环。下面我们就把常用的几种方式过一遍,看看它们各自的门道。

一、条件判断

最基础的条件判断,大家都不陌生:

复制代码 代码如下:
if ( ) {

}
elsif ( ) {

}
...
else{

}

这里要特别提一下——Perl允许你通过多个 elsif 来串联多个条件分支。整个逻辑就像流水线上的质检员:先检查第一个条件,如果成立,直接执行对应的代码块;不成立,则依次往下走,直到找到匹配的。如果所有条件都不成立,最后交给 else 兜底。这种写法在需要多级判断时比嵌套 if 清爽得多。

Perl中的控制结构学习笔记

二、循环

循环是Perl里最常用的控制结构之一,但玩法远不止“while”那么简单。我们来逐个拆解。

1、while循环

复制代码 代码如下:
while ( ) {

}

先判断条件,条件为真就进循环体。这是最经典的“先判断后执行”模式。

2、until循环

复制代码 代码如下:
until ( ) {

}

until 刚好和 while 反着来:条件为假时才执行循环体。实际上就等于 while (!条件),但语义上更直观——比如“直到某件事发生才停止”。

3、类C的for循环

这个就和C语言一模一样:

复制代码 代码如下:
for ($count=1; $count <= 5; $count++) {
# statements inside the loop go here
}

不过Perl在for循环里还能塞进逗号操作符,实现多条初始化或更新语句。看个例子:

复制代码 代码如下:
for ($line = , $count = 1; $count <= 3; $line = , $count++) {
print ($line);
}

这段代码等价于下面这个 while 版本:

复制代码 代码如下:
$line = ;
$count = 1;
while ($count <= 3) {
print ($line);
$line = ;
$count++;
}

两种写法效果一模一样,但for循环更紧凑,在需要同时维护多个变量时特别顺手。

4、针对列表(数组)每个元素的循环:foreach

语法很清晰:

复制代码 代码如下:
foreach localvar (listexpr) {
statement_block;
}

举个实际例子:

复制代码 代码如下:
foreach $word (@words) {
if ($word eq "the") {
print ("found the word 'the'n");
}
}

需要留意两点:

  • 循环变量 $word 是局部变量。如果在循环之前它已经有值,循环结束后该值会恢复原样,不会受到循环内赋值的影响。
  • 如果在循环内部修改了 $word,那么对应的数组元素也会跟着改变。看这个例子:
复制代码 代码如下:
@list = (1, 2, 3, 4, 5);
foreach $temp (@list) {
if ($temp == 2) {
$temp = 20;
}
}

执行之后,@list 就变成了 (1, 20, 3, 4, 5)。这是因为 $temp 本质上是数组元素的别名,改它就等于改数组本身。

5、do循环

语法长这样:

复制代码 代码如下:
do {
statement_block
} while_or_until (condexpr);

注意:do 循环会先执行一次循环体,然后再检查条件。这意味着循环体至少会被执行一次,适合那些“无论如何先干一次再说”的场景。

6、循环控制

Perl提供了三个控制关键字,比C语言多一个:

  • last:立即退出当前循环,等价于C的 break
  • next:跳过本次循环剩余语句,直接进入下一次迭代,等价于C的 continue
  • redo:这是Perl特有的。它的作用是“重做本次循环”,循环变量保持不变,直接回到循环体的最开头重新执行。注意,redodo 循环中是不起作用的。

另外,传统的 goto label; 也可以用,但不到万不得已真心不推荐,容易把代码搞成意大利面。

7、传统的goto label;语句

没错,Perl也支持 goto,但现代Perl编程几乎已经把它打入冷宫了。除非你在写一些极其底层的脚本,否则还是用结构化控制语句更靠谱。

三、单行条件

Perl里有一种非常简洁的写法,把条件和语句放在同一行:

复制代码 代码如下:
print ("This is zero.n") if ($var == 0);
print ("This is zero.n") unless ($var != 0);
print ("Not zero yet.n") while ($var-- > 0);
print ("Not zero yet.n") until ($var-- == 0);

虽然条件写在后面,但Perl解释器会先判断条件,再决定是否执行前面的语句。这种写法在过滤数据或打印调试信息时特别省事,一行搞定。

指令: unless

unless 的中文意思是“除非”,也就是“如果条件不成立,则执行”。基本用法:

复制代码 代码如下:
unless(判别运算式) {
判别式为假时语句块;
}

也可以写成一行:

复制代码 代码如下:
print"请输入您的分数?n";
$scorre=; #代表标准输入,会让使用者输入一字符串
chop($score); #将$score最后一个换行字符n删除掉
unless($score<60)
{
print"您的分数及格了!n";
}

或者更简洁:print"您的分数及格了!n" unless($score<60);

unless 也可以配合 else 使用:

复制代码 代码如下:
unless(判别运算式)
{
判别式为假时语句块;
}else{
判别式为真时语句块;
}

例子:

复制代码 代码如下:
print"请输入您的分数?n";
$scorre=;
chop($score);
unless($score<60)
{
print"您的分数及格了!n";
}else{
print"您的分数不及格!n";
}

进阶技巧:&&、|| 以及 ?: 作为控制结构

很多人可能不知道,Perl里 &&|| 和三元操作符 ?: 不仅仅是运算符,它们还能当控制结构用。这其实是利用了“短路求值”的特性。

比如常规的 if 语句:

复制代码 代码如下:
if (判别表达式)
{为真时语句块};

可以改写为:

复制代码 代码如下:
为真时的语句块 if (判别表达式)

但更极简的方式是:

复制代码 代码如下:
判别式 && 为真时的语句块

原理很简单:&& 在判断时,如果左边为假,就不会再去计算右边;如果左边为真,为了确定整个表达式的结果,必须计算右边。所以“为真时的语句块”实际上只会在判别式为真时执行。

反过来,unless(this){that} 可以替换成 this || that:左边为假时,右边才会执行。

至于三元操作符 ?:,典型用法:exp1 ? exp2 : exp3。如果 exp1 为真,则求 exp2 的值并返回;否则求 exp3 的值。在需要根据条件返回不同结果时,一行代码就能搞定,比写 if-else 更紧凑。

以上就是Perl控制结构的核心套路。掌握了这些,写脚本时就能手起刀落,游刃有余。当然了,实际项目中建议优先选择可读性强的写法,别为了炫技把代码搞得太晦涩。毕竟代码是写给人看的,顺便再让机器运行一下。

本文转载于:https://www.jb51.net/article/60775.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

产品推荐

热门关注