一文了解Perl语言

简介: 我在公众号发过很多编程语言的学习笔记,但是一直没有发Perl语言的编程教程。我大学的时候,学过一段时间的Perl语言,所以和Perl也有点缘分。这次去北京参加培训时发现他们教的Perl,所以接着机会发一波我现场的学习记录。

我在公众号发过很多编程语言的学习笔记,但是一直没有发Perl语言的编程教程。我大学的时候,学过一段时间的Perl语言,所以和Perl也有点缘分。这次去北京参加培训时发现他们教的Perl,所以接着机会发一波我现场的学习记录。

什么是Perl

学习一门语言最好了解下它的历史,知道它能干什么,有什么优势是,有什么不足。以下内容来自于百度百科

Perl,一种功能丰富的计算机程序语言,运行在超过100种计算机平台上,适用广泛,从大型机到便携设备,从快速原型创建到大规模可扩展开发。 [1]

Perl最初的设计者为拉里·沃尔(Larry Wall),于1987年12月18日发表。现在的版本为Perl 6,于2015年12月25日更新。

Perl借取了C、sed、awk、shell 脚本语言以及很多其他程序语言的特性,其中最重要的特性是它内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN。简而言之,Perl像C一样强大,像awk、sed等脚本描述语言一样方便,被Perl语言爱好者称之为“一种拥有各种语言功能的梦幻脚本语言”、“Unix 中的王牌工具”。

Perl 一般被称为“实用报表提取语言”(Practical Extraction and Report Language),你也可能看到“perl”,所有的字母都是小写的。一般,“Perl”,有大写的 P,是指语言本身,而“perl”,小写的 p,是指程序运行的解释器

从这段描述中,我们就知道了Perl最重要的就是它的文本处理能力, 而早期生物信息学的本质就是序列分析,所以“确认过眼神,我遇见对的人”,Perl成了生物信息必学语言。

Perl的安装

Perl语言在Linux系统以及其他类Unix系统,比如说MacOS里都是内置的,所以不需要额外安装,而在Windows系统中则需要额外下载,下载站点当然是官方的<www.perl.org>

img_1750e4aabf83561e4c95d12e2277e344.jpe
Perl下载

我后续在MacOS上学习Perl, 版本是5.18.2,这版本有点老旧,但是不妨碍学习。

Perl的Hello World

大部分的教程都是让大家写一个Perl脚本,比如说hello.pl,代码如下

#!/usr/bin/env perl
print "hello world \n"

然后用perl hello.perl执行。当然最快的方法还是用Perl的一行命令, 如下所示。

perl -e 'print "hello world"'

据说Perl高手能把Perl一行命令用的出神入化

Perl的编程基础

你可以用20多门语言说“我爱你”,但是不代表你会20门语言,所以会用Perl写"hello world"其实只是开始而已。了解一门编程语言,最少要掌握如下内容:

  • 数据类型和数据结构
  • 控制语句:条件语句、循环语句的用法
  • 函数写法和常用函数
  • 如何调用其他包

数据类型和数据结构

Perl支持的数据类型其实和大多数编程语言差不多,都有数值型(整数和浮点数)、字符串

数据结构分为:标量、数组、哈希。 这些数据结构都会和变量联系在一起,才能根据变量调取数据。Perl和Python一大不同就在于,Python认为括号",'以外的字符串都是变量名,而Perl的变量名之前必须要有专门的符号指明,这和shell类似。

perl -e '$id = abc; print "hello $id"' ; # 标量定义和调用
perl -e '@number = (1,2,3,4); print "@number\n"'# 数组定义和调用
perl -e '@number = (1,2,3,4); print "$number[1]\n"'# 数组定义和调用
perl -e '$age{Tom}=25;$age{David}=10; print "$age{Tom}\n"' # 哈希定义和调用
perl -e '%hash = (a=>b,c=>d,e=>f); print "$hash{a}\n"' # 哈希定义和调用

所以以后在Perl脚本看到一堆的符号时不要慌,看到$是标量,看到@是数组, 看到%就是哈希。

哈希对应Python的字典(dict), 对应R的列表(list)

控制结构

据说所有逻辑都可以用条件语句和循环语句来编写,所以每一门编程语言都一定要有。

条件语句的写法

perl -e '$x=0; if($x>0){$y=10;}elsif($x<0){$y=-10;}else{$y=0;} print "$y\n";'

循环语句有三种写法,for ,foreach, while

for ($x=5;$x<10;$x++){
    print "$x\n";
}
foreach $x(1..5){
    print "$x\n";
}

while 比较适用于文件读取和输出,

让我们先创建一个文件cat /etc/passwd > passwd.txt, 然后输出到另一个文件中

#/usr/bin/env perl
my $file_in = "passwd.txt";
my $file_out = "passwd_out.txt";
open IN, "<", $file_in;
open OUT, ">", $file_out;
while (<IN>){
    print OUT "$_\n";
}
close IN;
close OUT;

这里出现几个陌生的东西,一个是my表示声明变量,取决于具体位置来确定定义的变量是局部变量还是全局变量。 <>表示读取文件 , open是一个函数,用于创建一个文件句柄从而进行文件读写, close就是关闭文件读写。

这里有一个诡异的符号是的$_, 它表示是读取的当前行

函数写法和常用函数

在Perl里是找不到对象的,因为它不是面向对象编程的语言,它只有函数。

# 声明函数
sub sum{
    my ($m, $n) = @_;
    return ($m + $n );
}
# 调用函数
$sum_number = &sum(2,8);
print "$sum_number \n"

这里又出现了一个诡异的字符@_ ,表示是函数传参时放置参数的数组,可以从中取实参。 调用函数的时候需要在函数名前用&声明。

当然,大部分情况下,我们是不怎么写函数,我们都是面向调用函数编程,所以知道Perl里有哪些好用的函数很重要

  • 字符串相关函数: split, join, substr, chomp
  • 数组相关函数:shift, pop, unshift, push, scalar, length
  • 哈希相关函数:keys,values, exists
    -其他函数: sort, reverse

关于函数的用法,在http://perldoc.perl.org/perl.html进行搜索,一般要了解一门编程语言一定要查不知道多少遍的帮助文档。

正则表达式

其实正则表达式才是Perl的重点,学Perl不用Perl的正则表达式等于是没有学过Perl,但是这部分内容其实是非常多的,这里举出一个例子,

$seq = "ACCGGATCATTGTCAA";
if ($seq =~ m/AC/){
    print "$seq \n";
    $seq =~ s/AA/GG/;
    print "$seq \n";
    $seq =~ tr/ATGC/TACG/;
    print "$seq \n";
}

看到的=~就意味着后面将会出现正则表达式。=~不是简单的赋值符号=,也不是==用于逻辑判断,而是将变量的值进行对应的正则运算

  • m/AC/ : 指的是匹配(match),和命令行的grep一样
  • s/AA/GG/: 指的是替换(substitute), 将符合要求的替换成对应的值
  • tr/ATGC/TACG/: 指的是转换,和命令行的tr一样

资料推荐

希望本文让你对Perl有一个大致印象,想要继续深入的话,推荐两本书:

  • Perl语言入门:俗称小骆驼
  • 精通正则表达式:真正讲透了正则的精髓
目录
相关文章
|
9月前
|
存储 缓存 人工智能
Mooncake 最新进展:SGLang 和 LMCache 基于 Mooncake 实现高效 PD 分离框架
Mooncake 的架构设计兼具高性能和灵活性,为未来的扩展性和生态建设奠定了坚实基础。
|
机器学习/深度学习 存储 分布式计算
未来趋势:探索GraphRAG在大规模异构网络环境下的挑战与机遇
【10月更文挑战第11天】随着互联网和物联网技术的快速发展,数据不仅数量庞大,而且类型多样,形成了复杂的大规模异构网络。这些网络中包含了不同类型的节点(如文本、图像、视频等)以及它们之间的多种关系。如何有效地处理这种大规模异构网络,以便进行内容理解与生成,是当前研究的一个热点问题。Graph Retrieval-Augmented Generation (GraphRAG) 框架作为一种新兴的方法,在这一领域展现出了巨大的潜力。本文将深入探讨GraphRAG的基础理论、构建方法,并分析其在未来大规模异构网络环境下的挑战与机遇。
919 3
|
开发者 图形学 开发工具
Unity编辑器神级扩展攻略:从批量操作到定制Inspector界面,手把手教你编写高效开发工具,解锁编辑器隐藏潜能
【8月更文挑战第31天】Unity是一款强大的游戏开发引擎,支持多平台发布与高度可定制的编辑器环境。通过自定义编辑器工具,开发者能显著提升工作效率。本文介绍如何使用C#脚本扩展Unity编辑器功能,包括批量调整游戏对象位置、创建自定义Inspector界面及项目统计窗口等实用工具,并提供具体示例代码。理解并应用这些技巧,可大幅优化开发流程,提高生产力。
1345 1
|
SQL 关系型数据库 数据库
Flink CDC数据同步问题之处理更新业务失败如何解决
Flink CDC数据同步是指利用Flink CDC实现不同数据源之间的实时数据同步任务;本合集旨在提供Flink CDC数据同步的操作指南、性能优化建议和常见问题处理,助力用户高效实施数据同步。
|
存储 弹性计算 监控
【阿里云弹性计算】深入阿里云ECS配置选择:CPU、内存与存储的最优搭配策略
【5月更文挑战第20天】阿里云ECS提供多种实例类型满足不同需求,如通用型、计算型、内存型等。选择CPU时,通用应用可选1-2核,计算密集型应用推荐4核以上。内存选择要考虑应用类型,内存密集型至少4GB起。存储方面,系统盘和数据盘容量依据应用和数据量决定,高性能应用可选SSD或高效云盘。结合业务特点和预算制定配置方案,并通过监控应用性能适时调整,确保资源最优利用。示例代码展示了使用阿里云CLI创建ECS实例的过程。
661 5
|
消息中间件 Go API
Golang深入浅出之-Go语言中的微服务架构设计与实践
【5月更文挑战第4天】本文探讨了Go语言在微服务架构中的应用,强调了单一职责、标准化API、服务自治和容错设计等原则。同时,指出了过度拆分、服务通信复杂性、数据一致性和部署复杂性等常见问题,并提出了DDD拆分、使用成熟框架、事件驱动和配置管理与CI/CD的解决方案。文中还提供了使用Gin构建HTTP服务和gRPC进行服务间通信的示例。
1142 0
|
安全 Unix Shell
如何从BAM文件中提取fastq
虽然高通量测序分析最常用的操作是将fastq比对到参考基因组得到BAM文件,但偶尔我们也需要提取BAM文件中特定区域中fastq。最开始我认为这是一个非常简单的操作,因为samtools其实已经提供了相应的工具samtools fastq. 以biostar handbook的Ebola病毒数据为例,首先获取比对得到的BAM文件。
4176 0
|
JavaScript Java 关系型数据库
Springboot+vue的图书管理系统(有报告),Javaee项目,springboot vue前后端分离项目。
Springboot+vue的图书管理系统(有报告),Javaee项目,springboot vue前后端分离项目。
Springboot+vue的图书管理系统(有报告),Javaee项目,springboot vue前后端分离项目。
win10下端口被占用解决办法
原文:win10下端口被占用解决办法 调试socket通信的时候,如果程序未正常结束,重新启动会报端口被占用的错误。 一 查找被占用的端口 解决办法如下:按win+R输入cmd打开控制台,输入 netstat -ano|findstr 8080 查看8080端口被哪个进程所占用,结果如下:   改图显示8080被进程id为5036的程序所占用。
2637 0
|
JavaScript Java 关系型数据库
ssm+jsp牧场管理系统
牧场管理系统是针对目前牧场的实际需求,从实际工作出发,对过去的畜牧存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高,节省了开支,提高了工作的效率。本系统结合计算机系统的结构、概念、模型、原理、方法,在计算机各种优势的情况下,采用JAVA语言,结合SSM框架与Vue框架以及MYSQL数据库设计并实现的。它帮助牧场管理实现了信息化、网络化,通过测试,实现了系统设计目标,相比传统的管理模式,本系统合理的利用了畜牧数据资源,有效的减少了畜牧的经济投入,大大提高了牧场管理系统的效率。
308 0

热门文章

最新文章