【Perl】Perl 语言入门
1. Perl
语言介绍
Perl 是一种高级、解释型、动态编程语言,由Larry Wall
在1987年发布。Perl 以其强大的文本处理能力而闻名,特别是在处理报告生成、文件转换、系统管理任务等方面。它吸收了C
、Shell
脚本语言、AWK
、sed
等语言的特性,并加入了大量的创新。
1.1 Perl 语言特点:
- 灵活的语法:Perl 提供了多种方法来完成同一个任务,这被称为“ TIMTOWTDI ”(“There’s More Than One Way To Do It”)哲学。
- 正则表达式:Perl拥有非常强大的内建正则表达式支持,使得复杂的字符串操作变得简单。
- CPAN:Perl有一个庞大的库,称为
CPAN(Comprehensive Perl Archive Network)
,它提供了超过19万个模块,几乎可以用于所有类型的编程任务。 - 跨平台:Perl 可以在多种操作系统上运行,包括
Unix
、Windows
、Mac OS X
等。 - 快速开发:Perl 的设计允许程序员快速编写和修改代码。
尽管 Perl 在Web
开发领域曾经非常流行,但在过去的几年中,它的使用有所下降,部分原因是其他编程语言(如 Python 和Ruby)的兴起。不过,Perl 在特定领域仍然保持着强大的生命力,特别是在生物信息学和系统管理中。
1.2 常用框架和库
- CGI.pm:这是一个非常古老的 Perl 模块,用于处理
CGI
脚本。虽然现代Web开发已经很少使用 CGI,但CGI.pm
仍然是学习Perl Web
编程的一个很好的起点。 - Mojolicious:
Mojolicious
是一个现代的 Perl Web 框架,它内置了实时 Web 功能,支持RESTful API
、WebSockets
、JSON
、HTML5
等,非常适合开发高性能的 Web 应用程序。 - Dancer:
Dancer
是一个轻量级的 Perl Web 框架,它受到Python
的Flask
和Ruby
的Sinatra
的启发。它简单易用,适合快速开发Web应用程序。 - Catalyst:
Catalyst
是一个强大的、企业级的 Perl Web 框架,它提供了MVC
(模型-视图-控制器)架构,并支持多种数据库和模板系统。 - DBIx::Class:这不是一个 Web 框架,而是一个对象关系映射(ORM)框架,用于简化数据库操作。它与
Catalyst
等Web框架配合使用非常好。 - Plack:
Plack
是一个 Perl Web 服务器接口,它提供了一个标准的中间件堆栈和服务器抽象层,使得 Perl Web 应用程序可以在多种 Web 服务器上运行。 - Template Toolkit:这是一个强大的模板处理系统,用于生成文本,特别是HTML。它可以与上述任何 Web 框架配合使用。
- BioPerl :对于生物信息学家来说,
BioPerl
是一个非常重要的框架,它提供了一系列用于生物信息学研究的 Perl 模块。
这些框架和库可以在CPAN
(Comprehensive Perl Archive Network)上找到,CPAN 是 Perl 程序员的主要资源库,提供了大量的 Perl 模块供开发者使用。
- CPAN官方网址:CPAN(Comprehensive Perl Archive Network)官方网址
2. Perl 语法
2.1 变量和数据类型
# 标量变量,以$开头
my $scalar = "Hello, World!"; # 字符串
my $number = 42; # 数字
# 数组变量,以@开头
my @array = (1, "two", 3.14); # 数组元素可以是不同类型
# 哈希变量,以%开头
my %hash = ( # 哈希是键值对的集合"name" => "Alice","age" => 30,"job" => "Engineer"
);
# 打印变量
print $scalar; # 输出:Hello, World!
print $number; # 输出:42
print "@array"; # 输出:1two3.14
print "$hash{name} is $hash{age} years old.\n"; # 输出:Alice is 30 years old.
2.2 控制结构
2.2.1 条件语句
# if-elsif-else
if ($number == 42) {print "The answer to life, the universe, and everything.\n";
} elsif ($number == 23) {print "Another favorite number.\n";
} else {print "Just a number.\n";
}
# unless 是 if 的反向
unless ($number == 42) {print "Not the answer.\n";
}
2.2.2 循环结构
# while 循环
my $i = 0;
while ($i < 10) {print "$i ";$i++;
}
print "\n";
# for 循环
for (my $i = 0; $i < 10; $i++) {print "$i ";
}
print "\n";
# foreach 循环,用于遍历数组
foreach my $element (@array) {print "$element ";
}
print "\n";
2.3 正则表达式
# 使用 m// 匹配模式
if ($scalar =~ m/hello/) {print "Found 'hello' in the scalar.\n";
}
# 替换文本
$scalar =~ s/world/perl/; # 将 "world" 替换为 "perl"
print "$scalar\n"; # 输出:Hello, perl!
# 使用正则表达式分割字符串
my @words = split /, /, $scalar; # 以逗号和空格分割
print "@words\n"; # 输出:Hello perl
2.4 子程序(函数)
# 定义子程序
sub greet {my $name = shift; # 获取参数print "Hello, $name!\n";
}
# 调用子程序
greet("Bob"); # 输出:Hello, Bob!
2.5 文件操作
# 打开文件
open(my $fh, '<', 'example.txt') or die "Could not open file 'example.txt' $!";
# 读取文件
while (my $line = <$fh>) {chomp $line; # 移除行尾的换行符print "$line\n";
}
# 关闭文件
close($fh);
2.6 异常处理
在Perl中,异常处理通常是通过eval
块来实现的,它可以捕获块内代码抛出的异常。
2.6.1 使用 eval
进行异常捕获
eval {# 可能会抛出异常的代码
};
if ($@) {# $@ 包含了异常信息warn "An error occurred: $@";
}
2.6.2 使用 die
抛出异常
die "出现了一个错误";
2.6.3 捕获特定类型的异常
eval {# 可能会抛出异常的代码
};
if ($@ =~ /特定错误信息/) {# 处理特定类型的错误
}
2.6.4 使用 croak
和 carp
croak
和 carp
分别是 die
和 warn
的别名,它们提供了更好的错误消息上下文。
use Carp;
croak "致命错误"; # 相当于 die "致命错误 at 文件名 line 行号"
carp "警告信息"; # 相当于 warn "警告信息 at 文件名 line 行号"
2.6.5 异常处理程序示例
以下是一个使用eval
和die
进行异常处理的示例程序:
#!/usr/bin/perl
use strict;
use warnings;
use Carp;
sub risky_function {my $number = shift;if ($number < 0) {croak "传入了一个负数: $number";}return $number * 2;
}
eval {# 尝试执行可能会失败的代码my $result = risky_function(-5);print "结果是: $result\n";
};
if ($@) {# 处理异常warn "捕获到异常: $@";# 可以在这里进行恢复操作或记录日志等
}
# 继续执行其他代码
print "程序继续执行...\n";
在这个示例中,risky_function
函数检查传入的参数是否为负数,如果是,则使用croak
抛出一个异常。在eval
块中调用这个函数,如果发生异常,$@
变量会包含错误信息,然后在if
块中对异常进行处理。
运行上述脚本时,由于我们传递了一个负数给risky_function
,程序将捕获到异常,并打印出相应的警告信息,然后继续执行后面的代码。
3. Perl 综合示例
3.1 创建文件
以下是一个Perl脚本,该脚本会创建一个名为input.txt
的文本文件,并向该文件中写入指定的文本内容。
#!/usr/bin/perl
use strict;
use warnings;
# 要写入的文本内容
my $text = "Hello! I am Perl, my email is Test123\@email.com!\n";
# 打开文件进行写入,如果文件不存在则创建
open(my $fh, '>', 'input.txt') or die "无法打开文件 'input.txt': $!";
# 向文件写入文本内容
print $fh $text;
# 关闭文件句柄
close($fh);
# 输出提示信息
print "文件 'input.txt' 已创建并写入文本内容。\n";
将上面的代码保存为一个.pl
文件,例如create_input.pl
,然后在命令行中运行它:
perl create_input.pl
执行这个脚本后,它会在当前目录下创建一个名为input.txt
的文件,并写入指定的文本。记得在文本中的电子邮件地址中,@
符号前加上反斜杠\
进行转义,因为在Perl中@
符号有特殊含义(代表数组)。
3.2 文件处理
这个程序会执行以下操作:
- 读取
input.txt
文件。 - 将所有文本转换为小写。
- 使用正则表达式查找所有的电子邮件地址。
- 将找到的电子邮件地址打印到屏幕上。
- 将处理后的文本保存到
output.txt
文件中。
#!/usr/bin/perl
use strict;
use warnings;
# 打开文件进行读取
open(my $input_fh, '<', 'input.txt') or die "无法打开文件 'input.txt': $!";
# 打开文件进行写入
open(my $output_fh, '>', 'output.txt') or die "无法打开文件 'output.txt': $!";
# 读取文件内容
my @lines = <$input_fh>;
# 关闭读取文件句柄
close($input_fh);
# 遍历每一行文本
foreach my $line (@lines) {# 将文本转换为小写$line = lc($line);# 将处理后的文本写入到输出文件print $output_fh $line;# 使用正则表达式匹配电子邮件地址while ($line =~ m/(\S+@\S+)/g) {# 打印找到的电子邮件地址print "找到电子邮件地址: $1\n";}
}
# 关闭写入文件句柄
close($output_fh);
# 输出提示信息
print "文本处理完成,结果已保存到 'output.txt'.\n";
在上述代码中:
use strict;
和use warnings;
用于启用严格模式和警告,这是编写健壮 Perl 代码的好习惯。open
函数用于打开文件,my
关键字用于声明变量,or die
用于错误处理。<$input_fh>
用于读取文件内容到数组@lines
。lc
函数将字符串转换为小写。- 正则表达式
m/(\S+@\S+)/g
用于匹配电子邮件地址,其中\S+
匹配一个或多个非空白字符,@
是电子邮件地址中的符号,g
标志表示全局匹配。 print
函数用于输出信息到屏幕或文件。close
函数用于关闭文件句柄。
在运行此程序之前,请确保您有一个名为input.txt
的文件,并且 Perl 解释器已正确安装在您的系统上。您可以通过在命令行中运行perl your_script_name.pl
来执行此脚本,其中your_script_name.pl
是您保存上述代码的文件名。
这些示例涵盖了 Perl 的一些基本语法和常用功能。当然,Perl 是一个复杂的语言,这里只提供了入门级别的概览。对于更高级的特性,如引用、面向对象编程等,建议查阅更详细的文档或教程。
附注:这里是 Perl 的官方社区 Perl,感兴趣的小伙伴可以前往社区寻找更进一步的学习资源。
相关文章:
【Perl】Perl 语言入门
1. Perl语言介绍 Perl 是一种高级、解释型、动态编程语言,由Larry Wall在1987年发布。Perl 以其强大的文本处理能力而闻名,特别是在处理报告生成、文件转换、系统管理任务等方面。它吸收了C、Shell脚本语言、AWK、sed等语言的特性,并加入了大…...
godis源码分析——database存储核心1
前言 redis的核心是数据的快速存储,下面就来分析一下godis的底层存储是如何实现,先分析单机服务。 此文采用抓大放小原则,先大的流程方向,再抓细节。 流程图 源码分析 现在以客户端连接,并发起set key val命令为例…...
【UE5.1】Chaos物理系统基础——06 子弹破坏石块
前言 在前面我们已经完成了场系统的制作(【UE5.1】Chaos物理系统基础——02 场系统的应用_ue5)以及子弹的制作(【UE5.1 角色练习】16-枪械射击——瞄准),现在我们准备实现的效果是,角色发射子弹来破坏石柱。…...
Django是干什么的?好用么?
Django是一个开源的Python Web框架,用于快速开发高质量的Web应用程序。它提供了许多功能和工具,以简化常见的Web开发任务,如路由、请求处理、数据库管理等。 Django的优点包括: 简单易用:Django提供了清晰的文档和丰…...
C语言实现数据结构B树
B树(B-Tree)是一种自平衡的树数据结构,它维护着数据的有序性,并允许搜索、顺序访问、插入、删除等操作都在对数时间内完成。B树广泛用于数据库和操作系统的文件系统中。 B树的基本特性 根节点:根节点至少有两个子节点…...
[论文阅读]MaIL: Improving Imitation Learning with Mamba
Abstract 这项工作介绍了mamba模仿学习(mail),这是一种新颖的模仿学习(il)架构,为最先进的(sota)变换器策略提供了一种计算高效的替代方案。基于变压器的策略由于能够处理具有固有非…...
在HTML中使用JavaScript
在 HTML 中使用 JavaScript 有以下几种常见的方式: 一、内联脚本 (一)基本语法 内联脚本是将 JavaScript 代码直接嵌入到 HTML 文件的 <script> 标签内部。 <!DOCTYPE html> <html lang"en"> <head> <…...
InjectFix 热更新解决方案
简介 今天来谈一谈,项目种的客户端热更新解决方案。InjectFix是腾讯xlua团队出品的一种用于Unity中C#代码热更新热修复的解决方案。支持Unity全系列,全平台。与xlua的思路类似,InjectFix解决的痛点主要在于Unity中C#代码写的逻辑在发包之后无…...
PHP7.4安装使用rabbitMQ教程(windows)
(1),安装rabbitMQ客户端erlang语言 一,erlang语言安装 下载地址1—— 下载地址2——https://www.erlang.org/patches/otp-27.0 二,rabbitMQ客户端安装 https://www.rabbitmq.com/docs/install-windows (…...
分页以及tab栏切换,动态传类型
<view class"disTitle"><view class"disName">账户明细</view><view class"nav"><u-tabs lineWidth"0" :activeStyle"{color: #FD893F }" :list"navList" change"tabsChange&quo…...
【算法】平衡二叉树
难度:简单 题目 给定一个二叉树,判断它是否是 平衡二叉树 示例: 示例1: 输入:root [3,9,20,null,null,15,7] 输出:true 示例2: 输入:root [1,2,2,3,3,null,null,4,4] 输出&…...
五、 计算机网络(考点篇)
1 网络概述和模型 计算机网络是计算机技术与通信技术相结合的产物,它实现了远程通信、远程信息处理和资源共享。计算机网络的功能:数据通信、资源共享、管理集中化、实现分布式处理、负载均衡。 网络性能指标:速率、带宽(频带宽度或传送线路…...
如何解决数据分析问题:IPython与Pandas结合
如何解决数据分析问题:IPython与Pandas结合 数据分析是现代科学研究、商业决策和技术开发中的一个重要环节。IPython和Pandas是两个强大的工具,它们可以大大简化和加速数据分析的过程。本文将为初学者详细介绍如何结合使用IPython和Pandas来解决数据分析…...
如何在 Microsoft Edge 上使用开发人员工具
Microsoft Edge 提供了一套强大的开发人员工具,可帮助 Web 开发人员检查、调试和优化他们的网站或 Web 应用程序。 无论您是经验丰富的 Web 开发人员还是刚刚起步,了解如何有效地使用这些工具都可以对开发过程产生重大影响。 在本文中,我们…...
《Linux系统编程篇》认识在linux上的文件 ——基础篇
前言 Linux系统编程的文件操作如同掌握了一把魔法钥匙,打开了无尽可能性的大门。在这个世界中,你需要了解文件描述符、文件权限、文件路径等基础知识,就像探险家需要了解地图和指南针一样。而了解这些基础知识,就像学会了魔法咒语…...
Qt:22.鼠标相关事件(实例演示——鼠标进入/离开某控件的事件、鼠标按下事件、鼠标释放事件、鼠标双击事件)
目录 1.实例演示——鼠标进入/离开某控件的事件: 2.鼠标按下事件: 3.鼠标释放事件: 4.鼠标双击事件: 1.实例演示——鼠标进入/离开某控件的事件: 首先创建一个C类文件 Label,填写好要继承的父类 QLabe…...
笔记 4 :linux 0.11 中继续分析 0 号进程创建一号进程的 fork () 函数
(27)本条目开始, 开始分析 copy_process () 函数,其又会调用别的函数,故先分析别的函数。 get_free_page () ; 先 介绍汇编指令 scasb : 以及 指令 sstosd :…...
Vue3 引入Vanta.js使用
能搜到这篇文章 想必一定看过demo效果图了吧 示例 Vanta.js - Animated 3D Backgrounds For Your Website (vantajs.com) 1. 引入 在根目录 index.html中引入依赖 <script src"https://cdnjs.cloudflare.com/ajax/libs/three.js/r134/three.min.js"></sc…...
LeetCode --- 134双周赛
题目 3206. 交替组 I 3207. 与敌人战斗后的最大分数 3208. 交替组 II 3209. 子数组按位与值为 K 的数目 一、交替组 I & II 题目中问环形数组中交替组的长度为3的子数组个数,主要的问题在于它是环形的,我们要考虑首尾相接的情况,如何…...
快速读出linux 内核中全局变量
查问题时发现全局变量能读出来会提高效率,于是考虑从怎么读出内核态的全局变量,脚本如下 f open("/proc/kcore", rb) f.seek(4) # skip magic assert f.read(1) b\x02 # 64 位def read_number(bytes):return int.from_bytes(bytes, little,…...
postman录制设置
一、前言: postman是一个很好接口调试或是测试工具,简单方便,不需要很复杂的流程与技术,并且也具备录制条件。对于接口不了解,没有明确对应的说明,但又想通过接口进行一些测试使用其录制是一个不错的办…...
redis消息队列
redis 的list类型实现消息队列: list结构实现的优缺点: 2、pubsub模式(消息发布订阅)实现消息队列 pubsub的优缺点: 命令行实现: pub:第一次发送有两个接收,第二个只有一个接收 sub接收&#x…...
Linux vim的使用(一键安装则好用的插件_forcpp),gcc的常见编译链接操作
vim 在Linux系统上vim是个功能还比较完善的软件。但是没装插件的vim用着还是挺难受的,所以我们直接上一款插件。 我们只需要在Linux上执行这个命令就能安装(bite提供的) curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh …...
css基础(1)
CSS CCS Syntax CSS 规则由选择器和声明块组成。 CSS选择器 CSS选择器用于查找想要设置样式的HTML元素 一般选择器分为五类 Simple selectors (select elements based on name, id, class) 简单选择器(根据名称、id、类选择元素) //页面上的所有 …...
高并发线程池设计Nginx线程池源码剖析
为什么我们需要线程池?Why? 省流: 为了解决: 1.访问磁盘速度慢 2.等待设备工作 3..... 我们使用多线程技术,在IO繁忙的时候优先处理别的任务 为了解决多线程的缺陷: 1.创建、销毁线程时间消耗大 2.创建线程太多使系统资源不足或者线程频繁切换…...
SEO:6个避免被搜索引擎惩罚的策略-华媒舍
在当今数字时代,搜索引擎成为了绝大多数人获取信息和产品的首选工具。为了在搜索结果中获得良好的排名,许多网站采用了各种优化策略。有些策略可能会适得其反,引发搜索引擎的惩罚。以下是彭博社发稿推广的6个避免被搜索引擎惩罚的策略。 1. 内…...
STM32之六:SysTick系统滴答定时器
目录 1. SysTick简介 2. 时钟来源 3. SysTick寄存器 3.1 CTRL—SysTick控制及状态寄存器 3.2 RELOAD—SysTick重装载数值寄存器 3.3 CURRENT—SysTick当前数值寄存器 4. systick系统定时器配置 5. 延时函数实现 5.1 延时函数编写步骤 5.2 微秒级延时函数delay_us 5.…...
全栈物联网项目:结合 C/C++、Python、Node.js 和 React 开发智能温控系统(附代码示例)
1. 项目概述 本文详细介绍了一个基于STM32微控制器和AWS IoT云平台的智能温控器项目。该项目旨在实现远程温度监控和控制,具有以下主要特点: 使用STM32F103微控制器作为主控芯片,负责数据采集、处理和控制逻辑采用DHT22数字温湿度传感器,精确采集环境温湿度数据通过ESP8266 W…...
WPF学习(3) -- 控件模板
一、操作过程 二、代码 <Window x:Class"学习.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expressio…...
Netty Websocket SpringBoot Starter
netty websocket starter Quick Start Demo 项目 添加依赖 <!--添加源--> <repository><id>github</id><url>https://maven.pkg.github.com</url><snapshots><enabled>true</enabled></snapshots> </reposit…...
政府工程招标网站/天津seo网站管理
我们经常用一些正则来验证url,但是php自带了一个类似的函数filter_var。函数用法:参数标志:FILTER_FLAG_SCHEME_REQUIRED – 要求 URL 是 RFC 兼容 URL。(比如:http://example)FILTER_FLAG_HOST_REQUIRED – 要求 URL 包含主机名(…...
三站合一网站建设/外链生成
参考资料: http://www.cnblogs.com/chengzhengfu/p/4584510.html http://www.cnblogs.com/bizhu/archive/2012/05/12/2497493.html 1、TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。 在网络层有IP协议、ICMP协议、ARP协议、RARP…...
分析seo做的不好的网站/网络营销是干嘛的
一对一,和一对多的简单问题就部说了,直接来多对多这样的问题吧。首现关系映射为这样的:/// /// 对应数据库中dbo.Address表/// [DataContract][Table("Address", Schema "dbo")]public class AddressInfo{public Addres…...
新疆生产建设兵团第二中学网站/seo门户 site
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖…...
怎么用二维动画做网站首页步骤/爱站网怎么用
在MySQL服务器出现短暂(5~30秒)的性能波动的时候,一般的性能监控工具都很难抓住故障现场,也就很难收集对应较细粒度的诊断信息。另外,如果这种波动出现的频率很低,例如几天才一次,我们也很难人为的抓住现场,…...
wordpress 时区问题/房地产销售怎么找客户
Maven引入的传递性依赖机制,一方面大大简化和方便了依赖声明,另一方面,大部分情况下我们只需要关心项目的直接依赖是什么,而不用考虑这些直接依赖会引入什么传递性依赖。但有时候,当传递性依赖造成问题的时候ÿ…...