Perl中的控制结构学习笔记
Perl的控制结构非常灵活,通过if-elsif-else实现多级条件判断,依次检查各条件直到匹配。循环方面包括先判断后执行的while、条件为假时执行的until以及类C的for循环,提供了丰富的流程控制方式,可嵌套使用以应对复杂逻辑。
Perl的控制结构其实非常灵活,甚至有些“任性”。它不像C语言那样只有固定的几套招式,而是提供了多种姿势让你搞定条件判断和循环。下面我们就把常用的几种方式过一遍,看看它们各自的门道。
一、条件判断
最基础的条件判断,大家都不陌生:
}
elsif ( ) {
}
...
else{
}
这里要特别提一下——Perl允许你通过多个 elsif 来串联多个条件分支。整个逻辑就像流水线上的质检员:先检查第一个条件,如果成立,直接执行对应的代码块;不成立,则依次往下走,直到找到匹配的。如果所有条件都不成立,最后交给 else 兜底。这种写法在需要多级判断时比嵌套 if 清爽得多。

二、循环
循环是Perl里最常用的控制结构之一,但玩法远不止“while”那么简单。我们来逐个拆解。
1、while循环
}
先判断条件,条件为真就进循环体。这是最经典的“先判断后执行”模式。
2、until循环
}
until 刚好和 while 反着来:条件为假时才执行循环体。实际上就等于 while (!条件),但语义上更直观——比如“直到某件事发生才停止”。
3、类C的for循环
这个就和C语言一模一样:
# statements inside the loop go here
}
不过Perl在for循环里还能塞进逗号操作符,实现多条初始化或更新语句。看个例子:
print ($line);
}
这段代码等价于下面这个 while 版本:
$count = 1;
while ($count <= 3) {
print ($line);
$line = ;
$count++;
}
两种写法效果一模一样,但for循环更紧凑,在需要同时维护多个变量时特别顺手。
4、针对列表(数组)每个元素的循环:foreach
语法很清晰:
statement_block;
}
举个实际例子:
if ($word eq "the") {
print ("found the word 'the'n");
}
}
需要留意两点:
- 循环变量
$word是局部变量。如果在循环之前它已经有值,循环结束后该值会恢复原样,不会受到循环内赋值的影响。 - 如果在循环内部修改了
$word,那么对应的数组元素也会跟着改变。看这个例子:
foreach $temp (@list) {
if ($temp == 2) {
$temp = 20;
}
}
执行之后,@list 就变成了 (1, 20, 3, 4, 5)。这是因为 $temp 本质上是数组元素的别名,改它就等于改数组本身。
5、do循环
语法长这样:
statement_block
} while_or_until (condexpr);
注意:do 循环会先执行一次循环体,然后再检查条件。这意味着循环体至少会被执行一次,适合那些“无论如何先干一次再说”的场景。
6、循环控制
Perl提供了三个控制关键字,比C语言多一个:
last:立即退出当前循环,等价于C的break。next:跳过本次循环剩余语句,直接进入下一次迭代,等价于C的continue。redo:这是Perl特有的。它的作用是“重做本次循环”,循环变量保持不变,直接回到循环体的最开头重新执行。注意,redo在do循环中是不起作用的。
另外,传统的 goto label; 也可以用,但不到万不得已真心不推荐,容易把代码搞成意大利面。
7、传统的goto label;语句
没错,Perl也支持 goto,但现代Perl编程几乎已经把它打入冷宫了。除非你在写一些极其底层的脚本,否则还是用结构化控制语句更靠谱。
三、单行条件
Perl里有一种非常简洁的写法,把条件和语句放在同一行:
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 的中文意思是“除非”,也就是“如果条件不成立,则执行”。基本用法:
判别式为假时语句块;
}
也可以写成一行:
$scorre=; #代表标准输入,会让使用者输入一字符串
chop($score); #将$score最后一个换行字符n删除掉
unless($score<60)
{
print"您的分数及格了!n";
}
或者更简洁:print"您的分数及格了!n" unless($score<60);
unless 也可以配合 else 使用:
{
判别式为假时语句块;
}else{
判别式为真时语句块;
}
例子:
$scorre=;
chop($score);
unless($score<60)
{
print"您的分数及格了!n";
}else{
print"您的分数不及格!n";
}
进阶技巧:&&、|| 以及 ?: 作为控制结构
很多人可能不知道,Perl里 &&、|| 和三元操作符 ?: 不仅仅是运算符,它们还能当控制结构用。这其实是利用了“短路求值”的特性。
比如常规的 if 语句:
{为真时语句块};
可以改写为:
但更极简的方式是:
原理很简单:&& 在判断时,如果左边为假,就不会再去计算右边;如果左边为真,为了确定整个表达式的结果,必须计算右边。所以“为真时的语句块”实际上只会在判别式为真时执行。
反过来,unless(this){that} 可以替换成 this || that:左边为假时,右边才会执行。
至于三元操作符 ?:,典型用法:exp1 ? exp2 : exp3。如果 exp1 为真,则求 exp2 的值并返回;否则求 exp3 的值。在需要根据条件返回不同结果时,一行代码就能搞定,比写 if-else 更紧凑。
以上就是Perl控制结构的核心套路。掌握了这些,写脚本时就能手起刀落,游刃有余。当然了,实际项目中建议优先选择可读性强的写法,别为了炫技把代码搞得太晦涩。毕竟代码是写给人看的,顺便再让机器运行一下。
Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。
Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。
Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。
PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。
Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等
Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。













