当前位置: 首页 > news >正文

Perl 语言开发(五):循环语句

目录

1. 循环语句概述

2. while 循环

2.1 基本语法

2.2 示例

2.3 无限循环

3. until 循环

3.1 基本语法

3.2 示例

3.3 无限循环

4. for 循环

4.1 基本语法

4.2 示例

4.3 嵌套循环

5. foreach 循环

5.1 基本语法

5.2 示例

5.3 遍历哈希

6. 循环控制语句

6.1 last 语句

6.2 next 语句

6.3 redo 语句

7. 实际应用场景

7.1 数据处理

7.2 Web 爬虫

7.3 数据库操作

8. 结论


循环语句是编程语言中的重要组成部分,用于重复执行某些操作直到满足特定条件。在 Perl 语言中,循环语句同样具有重要地位,能够帮助开发者有效处理重复任务。这篇文章将详细介绍 Perl 中的各种循环语句及其应用场景,帮助读者更好地理解和使用这些控制结构。

1. 循环语句概述

循环语句是一种控制结构,允许程序在特定条件下重复执行一段代码。Perl 语言中提供了多种循环语句,包括 while 循环、until 循环、for 循环和 foreach 循环。这些循环语句各有特点,适用于不同的编程场景。

2. while 循环

2.1 基本语法

while 循环是 Perl 中最基本的循环语句之一,其基本语法如下:

while (condition) {# code to be executed
}

while 循环中,条件 condition 会在每次迭代前进行检查,如果条件为真(true),则执行循环体内的代码;如果条件为假(false),则终止循环。

2.2 示例

以下是一个使用 while 循环的示例,该示例打印从 1 到 5 的数字:

my $i = 1;
while ($i <= 5) {print "$i\n";$i++;
}

在这个例子中,变量 $i 初始值为 1,循环体内的代码每次迭代后会将 $i 加 1,当 $i 的值超过 5 时,循环终止。

2.3 无限循环

while 循环也可以用于创建无限循环,这在某些情况下是有用的。无限循环的语法如下:

while (1) {# code to be executed indefinitely
}

以下是一个无限循环的示例,该示例每秒钟打印一条消息:

use Time::HiRes qw(sleep);while (1) {print "This loop will run forever\n";sleep(1);
}

在实际开发中,通常会在循环体内加入某种条件检查或用户输入来打破无限循环。

3. until 循环

3.1 基本语法

until 循环的作用与 while 循环相反,循环体内的代码会在条件为假(false)时执行,而在条件为真(true)时终止。其基本语法如下:

until (condition) {# code to be executed
}

3.2 示例

以下是一个使用 until 循环的示例,该示例打印从 1 到 5 的数字:

my $i = 1;
until ($i > 5) {print "$i\n";$i++;
}

在这个例子中,变量 $i 初始值为 1,循环体内的代码每次迭代后会将 $i 加 1,当 $i 的值超过 5 时,条件 $i > 5 为真,循环终止。

3.3 无限循环

while 循环一样,until 循环也可以用于创建无限循环,其语法如下:

until (0) {# code to be executed indefinitely
}

以下是一个无限循环的示例,该示例每秒钟打印一条消息:

use Time::HiRes qw(sleep);until (0) {print "This loop will run forever\n";sleep(1);
}

4. for 循环

4.1 基本语法

for 循环是一种更加结构化的循环语句,通常用于需要精确控制循环次数的场景。其基本语法如下:

for (initialization; condition; increment) {# code to be executed
}

for 循环中,initialization 用于初始化循环变量,condition 用于检查循环条件,increment 用于更新循环变量。

4.2 示例

以下是一个使用 for 循环的示例,该示例打印从 1 到 5 的数字:

for (my $i = 1; $i <= 5; $i++) {print "$i\n";
}

在这个例子中,变量 $i 初始值为 1,循环体内的代码每次迭代后会将 $i 加 1,当 $i 的值超过 5 时,条件 $i <= 5 为假,循环终止。

4.3 嵌套循环

for 循环可以嵌套使用,用于处理多维数据结构或实现复杂的迭代逻辑。以下是一个嵌套 for 循环的示例,该示例打印一个 5x5 的乘法表:

for (my $i = 1; $i <= 5; $i++) {for (my $j = 1; $j <= 5; $j++) {printf "%d\t", $i * $j;}print "\n";
}

在这个例子中,外层循环控制行,内层循环控制列,每个元素的值是行号和列号的乘积。

5. foreach 循环

5.1 基本语法

foreach 循环用于遍历列表或数组中的每个元素,其基本语法如下:

foreach my $element (@array) {# code to be executed
}

5.2 示例

以下是一个使用 foreach 循环的示例,该示例打印数组中的每个元素:

my @array = (1, 2, 3, 4, 5);
foreach my $element (@array) {print "$element\n";
}

在这个例子中,foreach 循环遍历数组 @array 中的每个元素,并将其打印出来。

5.3 遍历哈希

foreach 循环还可以用于遍历哈希(散列)中的每个键值对。以下是一个示例:

my %hash = (a => 1, b => 2, c => 3);
foreach my $key (keys %hash) {print "$key => $hash{$key}\n";
}

在这个例子中,foreach 循环遍历哈希 %hash 中的每个键,并打印出对应的键值对。

6. 循环控制语句

6.1 last 语句

last 语句用于立即终止循环,相当于其他编程语言中的 break 语句。以下是一个示例:

my @array = (1, 2, 3, 4, 5);
foreach my $element (@array) {if ($element == 3) {last;}print "$element\n";
}

在这个例子中,当数组元素等于 3 时,循环终止,不再打印后续元素。

6.2 next 语句

next 语句用于跳过当前迭代,直接进入下一次迭代,相当于其他编程语言中的 continue 语句。以下是一个示例:

my @array = (1, 2, 3, 4, 5);
foreach my $element (@array) {if ($element == 3) {next;}print "$element\n";
}

在这个例子中,当数组元素等于 3 时,跳过打印该元素,继续打印后续元素。

6.3 redo 语句

redo 语句用于重新执行当前迭代,而不进行条件检查。以下是一个示例:

my $count = 0;
while ($count < 5) {$count++;if ($count == 3) {redo;}print "$count\n";
}

在这个例子中,当 $count 等于 3 时,redo 语句重新执行当前迭代,但不增加 $count,导致 3 永远不会被打印。

7. 实际应用场景

7.1 数据处理

循环语句在数据处理任务中非常常见。例如,以下代码示例展示了如何使用 foreach 循环读取并处理文件中的每一行数据:

open my $fh, '<', 'data.txt' or die "Cannot open data.txt: $!";
while (my $line = <$fh>) {chomp $line;print "Processing: $line\n";
}
close $fh;

7.2 Web 爬虫

在编写 Web 爬虫时,循环语句用于遍历网页和处理数据。以下示例展示了如何使用 while 循环从网页中提取数据:

use LWP::Simple;
my $url = 'http://example.com';
my $content = get($url) or die "Could not fetch $url";
while ($content =~ m/<a href="(http[^"]+)">/g) {print "Found URL: $1\n";
}

7.3 数据库操作

在进行数据库操作时,循环语句用于遍历查询结果并处理数据。以下示例展示了如何使用 foreach 循环处理数据库查询结果:

use DBI;
my $dbh = DBI->connect('DBI:mysql:database=test;host=localhost', 'user', 'password');
my $sth = $dbh->prepare('SELECT name FROM users');
$sth->execute();
while (my @row = $sth->fetchrow_array) {print "User: $row[0]\n";
}
$sth->finish();
$dbh->disconnect();

8. 结论

循环语句是 Perl 语言中不可或缺的部分,它们为程序提供了强大的控制能力,能够高效地处理重复任务。通过掌握 whileuntilforforeach 循环以及 lastnextredo 控制语句,开发者可以编写出更加灵活和高效的代码。

在实际开发中,选择合适的循环语句可以提高代码的可读性和性能。希望本文能帮助读者更好地理解和使用 Perl 中的循环语句,提升编程技能。

相关文章:

Perl 语言开发(五):循环语句

目录 1. 循环语句概述 2. while 循环 2.1 基本语法 2.2 示例 2.3 无限循环 3. until 循环 3.1 基本语法 3.2 示例 3.3 无限循环 4. for 循环 4.1 基本语法 4.2 示例 4.3 嵌套循环 5. foreach 循环 5.1 基本语法 5.2 示例 5.3 遍历哈希 6. 循环控制语句 6.1 …...

线性系统理论及应用GUI设计及仿真

目录 1.控制系统的状态空间模型 1.1.状态空间模型 1.2 传递函数模型 1.3 传递函数转换为状态空间模型 1.4.状态空间模型转换为传递函数 1.5.状态空间模型转化为约当标准型 2.线性系统的时域分析 2.1.矩阵指数函数的计算 2.2.线型定常连续系统的状态空间模型求解 3.线…...

RAG综述汇总

第一篇&#xff1a;Retrieval-Augmented Generation for Large Language Models: A Survey(同济/复旦) 论文链接 1.简介 这篇全面的综述论文详细研究了 RAG 范式的发展&#xff0c;包括 Naive RAG、Advanced RAG 和 Modular RAG。介绍了 RAG 框架的三个基础技术&#xff0c;…...

智慧水利的变革之路:如何通过大数据、物联网和人工智能构建高效、智能、可持续的水利管理新模式

目录 一、引言&#xff1a;智慧水利的时代背景与意义 二、大数据&#xff1a;水利管理的数据基石 &#xff08;一&#xff09;数据收集与整合 &#xff08;二&#xff09;数据分析与挖掘 三、物联网&#xff1a;水利管理的感知神经 &#xff08;一&#xff09;智能感知与监…...

springcloud-gateway 网关组件中文文档

Spring Cloud网关 Greenwich SR5 该项目提供了一个基于Spring生态系统的API网关&#xff0c;其中包括&#xff1a;Spring 5&#xff0c;Spring Boot 2和项目Reactor。Spring Cloud网关的目的是提供一种简单而有效的方法来路由到API&#xff0c;并向它们提供跨领域的关注&#x…...

Android Gradle开发与应用Gradle详细使用

一、Gradle 基础知识 1. Gradle 构建脚本 Gradle 构建脚本通常使用 Groovy 或 Kotlin DSL 编写。Android 项目中有两个主要的 Gradle 构建脚本&#xff1a; a、项目级构建脚本 (build.gradle 或 build.gradle.kts)&#xff1a;位于项目的根目录中&#xff0c;用于配置项目范…...

软件架构的23个基本原则:构建稳健、可扩展的系统

软件架构是任何软件项目成功的关键。良好的架构不仅能够支撑软件的功能实现&#xff0c;还能确保其性能、可维护性、可扩展性和安全性。在软件工程领域&#xff0c;经过多年的研究和实践&#xff0c;已经总结出了许多宝贵的原则和模式&#xff0c;用以指导软件架构的设计。以下…...

江苏省生产经营单位安全管理考核(附答案)

单选题 1.生产经营单位的主要负责人在本单位发生重大生产安全事故后逃匿的,由( )处 15 日以下拘留。 A、公安机关 B、检察机关 C、安全生产监督管理部门正确答案:A 2.据一些资料表明,心跳呼吸停止,在()min内进行抢救,约80%可以救活。 A、1 B、2 C、3正确答案:A 3.拉开闸刀时…...

Kafka第四篇——生产数据总体概括,源码解析分区策略,数据收集器,Sender发送线程,key值

目录 流程图以及总体概述 拦截器 分区器以及分区计算策略 为啥进行分区计算&#xff1f; producer生产者怎么知道有哪些分区&#xff1f; 分区计算 如何自定义实现分区器&#xff1f; 想说的在图里啦&#xff01;宝宝&#xff01;&#x1f4a1; ​编辑 如果key值忘记传递了呢&a…...

二叉树的链式结构

前言 Hello,友友们&#xff0c;小编将继续重新开始数据结构的学习&#xff0c;前面讲解了堆的部分知识&#xff0c;今天将讲解二叉树的链式结构的部分内容。 1.概念回顾与新增 二叉树是一种数据结构&#xff0c;其中每个节点最多有两个子节点&#xff0c;分别是左子节点和右子…...

【STM32】在标准库中使用DMA

1.MDA简介 DMA全称Direct Memory Access,直接存储区访问。 DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作&#xff0c;传输动作本身是由DMA控制器来实现和完成的。DMA传输方式无需CPU直接控制传输&#xff0c;也没有中断处理方式那样保留现场和…...

多线程详解

文章目录 多线程创建方式p3一些教程 狂神说 多线程创建方式p3 代码: package com.demo1;//创建线程方式一:继承Thread类&#xff0c;重写run()方法&#xff0c;调用start开启线程/*** 总结:注意,线程开启不一定立即执行,dCPU调度执行*/public class TestThread1 extends Thre…...

软件工程需求之:业务需求与用户需求

在软件开发项目中&#xff0c;"业务需求"和"用户需求"是两个核心概念&#xff0c;它们分别从不同的角度描述了软件应该具备的功能和特性。理解这两个概念的区别对于成功地规划和开发软件至关重要。 业务需求 业务需求主要关注于软件项目如何帮助实现企业…...

Nettyの源码分析

本篇为Netty系列的最后一篇&#xff0c;按照惯例会简单介绍一些Netty相关核心源码。 1、Netty启动源码分析 代码就使用最初的Netty服务器案例&#xff0c;在bind这一行打上断点&#xff0c;观察启动的全过程&#xff1a; 由于某些方法的调用链过深&#xff0c;节约篇幅&#xf…...

MySQL远程登录

root是超级管理员&#xff0c;默认情况下&#xff0c;root不能作为远程登录的用户名&#xff0c;远程登录前&#xff0c;需要将登录的数据库在本地登录&#xff0c;修改权限&#xff0c;输入&#xff1a; update user set host % where user root ; 回车键&#xff0c;再输…...

html的作业

目录 作业题目 1.用户注册 A图 B代码 2.工商银行电子汇款单 A图 B代码 3.李白诗词 A图 B代码 4.豆瓣电影 A图 B代码 学习产出&#xff1a; 作业题目 1.用户注册 A图 B代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset&qu…...

【TORCH】查看dataloader里的数据,通过dataloader.dataset或enumerate

文章目录 dataloader.dataset示例代码使用自定义数据集使用 MNIST 数据集 说明 enumerate示例代码说明使用 MNIST 数据集的例子 dataloader.dataset 是的&#xff0c;您可以直接访问 train_loader 的数据集来查看数据&#xff0c;而不必通过 enumerate 遍历数据加载器。可以通…...

KDTree 简单原理与实现

介绍 K-D树是一种二叉树的数据结构&#xff0c;其中每个节点代表一个k维点&#xff0c;可用于组织K维空间中的点&#xff0c;其中K通常是一个非常大的数字。二叉树结构允许对多维空间中的点进行非常有效的搜索&#xff0c;包括最近邻搜索和范围搜索&#xff0c;树中的每个非叶…...

[c++] 可变参数模版

前言 可变参数模板是C11及之后才开始使用,学校的老古董编译器不一定能用 相信大家在刚入门c/c时都接触过printf函数 int printf ( const char * format, ... ); printf用于将数据格式化输出到屏幕上,它的参数非常有意思,可以支持任意数量,任意类型的多参数.而如果我们想实现类…...

QWidget窗口抗锯齿圆角的一个实现方案(支持子控件)2

QWidget窗口抗锯齿圆角的一个实现方案&#xff08;支持子控件&#xff09;2 本方案使用了QGraphicsEffect&#xff0c;由于QGraphicsEffect对一些控件会有渲染问题&#xff0c;比如列表、表格等&#xff0c;所以暂时仅作为研究&#xff0c;优先其他方案 在之前的文章中&#…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...