我在公众号发过很多编程语言的学习笔记,但是一直没有发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系统中则需要额外下载,下载站点当然是官方的 我后续在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="">
循环语句有三种写法,for ,foreach, while for ($x=5;$x10;$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 (){ 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.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';}
看到的=~ 就意味着后面将会出现正则表达式。=~ 不是简单的赋值符号= ,也不是== 用于逻辑判断,而是将变量的值进行对应的正则运算
|