×

Perl语言入门

前端技术网 前端技术网 发表于2024-02-03 16:39:03 浏览505 评论0

抢沙发发表评论

一、perl是脚本语言还是什么语言

Perl简介Perl最初只是Unix系统管理员的一个工具,在工作日里被用在无数的小任务中。从那以后,它逐步发展成为一种全功能的程序设计语言,特别是在各种计算平台上,它被用作Web编程、数据库处理、XML处理以及系统管理——它能够完成所有这些工作,同时仍然是处理小的日常工作的完美工具,这是它的设计初衷。Perl快速、有趣,而且特别有用。很多人因为需要Perl而使用它,又因为热爱它而继续使用它。_摘自Perl语言入门Oreilly_*Perl是一门自由且功能强大的编程语言。自1987年初次登台亮相以来,它的用户数一直急剧膨胀。从最初被当作一种在跨平台环境中书写可移植工具的高级语言开始,Perl就已经被广泛地认为是一种工业级的强大工具,可以在任何地方用来完成你的工作。Perl特别适合系统管理和Web编程。Perl实际上已经被所有Unix(包括Linux)捆绑在一起作为标准部件发布,而且也被广泛用于MicrosoftWindows和几乎所有其他操作系统。Amiga、BeOS、VMS、MVS和AppleMacintosh等也只是Perl已经完成移植的平台的一小部分。_摘自Perl语言编程Oreilly_很多人使用Perl来替代shell,很多人使用Perl来避免编写繁琐的C,C或Java程序.如果你的程序要求高效率,你可以把费时部分用C写,然后与Perl结合使用.你几乎可以使用Perl来解决所有问题.使用Perl与否完全是你的决定:)

二、如何系统的学习Perl语言

Perl是典型的脚本语言,短小精悍,非常容易上手,尤其适合处理文本,数据,以及系统管理。它在老一辈的生物信息学分析人员中非常流行,出于历史遗留原因大家肯定会或多或少地接触 Perl,即使你再怎么推崇Python或者GO等新兴编程语言。

Perl语言入门

1入门资料

两个半小时入门指导:https://qntm.org/files/perl/perl.html

21天学完 perl,自己搜索下载PDF书籍吧!

大小骆驼书,建议都看完,以囫囵吞枣的方式阅读,只看基础知识来入门,难点全部跳过。

官网:https://www.perl.org/

函数如何用:都可以在http://perldoc.perl.org/perl.html查到

Perl语言入门

论坛:http://www.perlmonks.org/

2知识要点

在看书的同时,你必须记住和熟练使用的知识点是下面这些:

理解perl里面的三种变量表示方式

$表示单个变量

用单双引号区别,q(),qq()

@表示多个变量组成的数组,qw()

%表示关系型变量-hash

变量不严格区分类型,没有int/float/double/char这样的概念

三种变量都有对应的操作技巧:

简单变量的操作函数

Numerical operators:<>>,<>>=,==,!=,<=>,+,*

String operators: lt, gt, le, ge, eq, ne, cmp,., x

数组操作(pop/push/shift/unshift/splice/map/grep/join/split/sort/reverse)

hash操作方式

(keys,values,each,delete,exists)

具体需要在实战里面体会:http://www.biotrainee.com/forum-90-1.html生信人必练的200个数据处理任务(欢迎大家去练习)

变量内容交换,字符型转为数值型,字符串转为字符数组,字符串变量,heredoc,字符串分割,字符串截取,随机数生成,取整,各种概率分布数,多维矩阵如何操作,进制转换,hash翻转,数组转hash

上下文环境

这个比较复杂: http://www.perlmonks.org/?node_id=738558,就是需要理解你写的程序是如何判断你的变量的,你以为的不一定是你以为的。

正则表达式

这也是一个非常重要的一块内容,基础用法就是m和s,一个匹配,一个替换,比较有趣的就是1,2等等捕获变量。

内建变量

就是perl语言设计的时候定义了一大堆的全局变量($_$,$0$>$<$!=""$.=""@argv=""@f=""@_=""@inc=""%env="">)

。外表上看起来都是一个$@%符号后面加上一大堆的奇奇怪怪的字符,表示一些特殊变量,这也是perl语言饱受诟病的原因。但是有些非常重要,懂了它之后写程序会方便。下载一个表格,里面有近100个预定义变量需要学习的。

控制语句(循环/条件/判断)

if... elsif... else...

unless/while/next/last/for/foreach

读写文件,脚本实战!

while(<>){

#do something!

}

这是我最喜欢的一个程序模板,读取文件,根据需要处理文件,然后输出。需要实现非常多的功能,然后就可以自己总结脚本技巧,也能完全掌握perl的各种语法。在生物信息学领域,需要实现的功能有!

perl单行命令

我个人特别喜欢这个知识点,我也专门下载过一本书来学习,把这个教程看完就基本上能全明白:http://www.catonmat.net/blog/perl-one-liners-explained-part-one/。学习单行命令的前提是掌握非常多的奇奇怪怪的perl自定义变量和perl的基础语法,用熟练了之后就非常方便,很多生物信息学数据处理过程我现在基本不写脚本,都是直接写一行命令,完全代替了shell脚本里面的awk、sed/grep系列命令。(perl-p-a-n-a-l-i-F-M)

预定义函数

perl是一个非常精简的语言,自定义的函数非常少,连min max这样常见的函数都没有,如果你需要使用这样的功能,要么自己写一个函数,要么使用加强版的包,perl的包非常多。

下面列出一些,我常用的函数:

程序必备: use/die/warn/print/open/close/<>/

数学函数:sin/cos/log/abs/rand/srand/sqrt

字符串函数:uc/lc/scaler/index/rindex/length/pos/substr/sprintf/chop/chomp/hex/int/oct/ord/chr/unpack/unencode

defined/undef

系统操作相关

perl语言是跨平台的,因为它的执行靠的是perl解释器,而perl的解释器可以安装在任何机器上面。所以可以用perl来代替很多系统管理工作。

系统命令调用

文件句柄操作(STDIN,STDOUT,STDERR,ARGV,DATA,)

系统文件管理(mkdir/chdir/opendir/closedir/readdir/telldir/rmdir/)

一些高级技巧

自定义函数 sub,参数传递,数组传递,返回值

模块操作(模块安装,加载,模块路径,模块函数引用)

引用(变量的变量)

选择一个好的编辑器-编译器,editplus,notepad++,jEdit,编程习惯的养成。

搞清楚perl版本的问题,还有程序编码的问题,中文显示的问题。

程序调试

perl常见模块学习

perl和LWP/HTML做网络爬虫必备,重点是DOM如何解析;

perl和CGI编程,做网站的神器,重点是html基础知识;

DBI相关数据库,用perl来操作mysql等,当然,重点是mysql知识;

GD and GD::Graph可以用来画图,但是基本上没有人用了,除了CIRCOS画圈圈图火起来了;

TK模块,可以编写GUI界面程序,但是也几乎没有人用了;

XML/pdf/excel/Json相关的模块可以用来读取非文本格式数据,或者输出格式化报告;

socket通信相关,高手甚至可以写出一个QQ的模仿版本;

最后不得不提的就是Bioperl了,虽然我从来没有用过,但是它的确对初学者非常有用,大多数人不提倡重复造轮子,但我个人觉得,对初学者来说,重复造轮子是一个非常好的学习方式。大家可以仿造bioperl里面的各个功能,用自己的脚本来实现!

3复习资料

如果你感觉学的差不多了,就可以下载一些复习资料,查漏补缺:

http://michaelgoerz.net/refcards/perl_refcard.pdf

https://rc.hms.harvard.edu/training/perl/Perl%20Cheat%20Sheet.pdf

https://www.cheatography.com/mishin/cheat-sheets/perl-reference-card/

http://www.catonmat.net/download/perl.predefined.variables.pdf

http://www.erudil.com/preqr.pdf

https://www.cs.tut.fi/~jkorpela/perl/regexp.html

https://support.sas.com/rnd/base/datastep/perl_regexp/regexp-tip-sheet.pdf

三、Perl入门教程

2楼真是的,人家还没入门,你直接整个文件操作干嘛?

什么是Perl?

Perl是一种最初开发用于文本操作的编程语言。现在它能应用于广泛的任务,包括系统管理、 web开发、网络编程、 GUI开发和更多的普通用途。

这个语言以实用性为目标(易用、高效、完整)宁愿失去美丽(小巧、优雅、迷你)。它使用方便,且支持面向过程和面向对象编程,内置强大的文本处理支持,并有世界上最令人印象深刻的第三方模块的集中营。

运行Perl程序

在Unix命令行运行Perl程序:

perl progname.pl

另一种方法是,把这个放到你的脚本第一行:

#!/usr/bin/env perl

然后用/path/to/script.pl运行。当然,首先得让它能执行,你得chmod 755 script.pl(Unix下)。

(这里的第一行假设你有env程序。你也可以直接把你的perl解释器的路径直接放到第一行,比如#!/usr/bin/perl)

安全保障

默认情况下,Perl非常随意。为了使它更强健建议每个程序由下列行开始:

1.#!/usr/bin/perl

2. use strict;

3. use warnings;

附加的两行从perl中捕获您的代码中的各种常见的问题。它们检查不同的事情,所以你需要两个都加上。一个潜在的问题通过use strict;捕获,一旦它捕获到问题,会马上让你的程序停止运行。当然使用use warnings;时,仅仅出现警告(就好像命令行的-w选项)并不会停止程序。

基本语法概述

一个Perl脚本或程序包含一条或多条语句。这些语句只需直接写在脚本中,而不需要像main()这样的东西作为程序入口。

Perl语句以分别结束:

print"Hello, world";

以星号(#)开始的语句是注释:

# This is a comment(这是一条注释)

空白字符会被Perl忽略:

1. print

2."Hello, world"

3.;

……引号里的字符串除外:

1.# this would print with a linebreak in the middle

2. print"Hello

3. world";

字符串使用双引号或单引号:

1. print"Hello, world";

2. print'Hello, world';

然而,只有双引号会“插入”变量值和像换行符(\n)这样的特殊字符(转义字符):

1. print"Hello,$name\n";# works fine

2. print'Hello,$name\n';# prints$name\n literally

数字不需要引号:

print 42;

你可以使用或省略括号来传递函数的参数。它们只是在偶尔要改变或明确优先级的时候必须使用。

1. print("Hello, world\n");

2. print"Hello, world\n";

Perl变量类型

Perl有3种主要的变量类型:标量(scalars)、数组(arrays)和哈希(hashes)。

*标量(Scalars)

一个标量表示只有一个值:

1. my$animal="camel";

2. my$answer= 42;

标量的值可以是字符串、整数或浮点数,并且Perl会在需要的时候自动转换。你不需要预先声明你的变量类型,但是你需要在第一次使用它们的时候,使用my来声明它们。(这是use strict;所要求的)

标量可以用不用的方式使用:

1. print$animal;

2. print"The animal is$animal\n";

3. print"The square of$answer is",$answer*$answer,"\n";

有大量的“魔法”标量的名称看上去像标点或线路噪音。这些特殊的变量用于各种目的。现在你只要知道其中一个,这就是“默认变量”$_。它被许多Perl的函数用作默认的参数,并且它被隐式设置到某些循环结构中。

print;# prints contents of$_ by default(默认打印$_的内容)

*数组(Arrays)

数组用于表示一些值的列表:

1. my@animals=("camel","llama","owl");

2. my@numbers=(23, 42, 69);

3. my@mixed=("camel", 42, 1.23);

特殊变量$#array将返回数组最后一个元素的索引:

print$mixed[$#mixed];# last element, prints 1.23

你可能想使用$#array+ 1来得到这个数组的元素个数。别急,这很容易。在Perl预想找到一个标量值的时候(“在标量上下文”),使用@array会得到数组的元素个数:(译注:“上下文”是Perl很重要的特性之一,请查阅相关文档或在无忧Perl搜索相关内容)

if(@animals< 5){...}#译注:当@animals数组的元素个数少于5个的时候

当我们从数组获得元素值的时候,需要使用$,因为我们只要获取数组里的一个值;你请求一个标量,然后会获得一个标量。

从数组里获取多个值:

(译注:获取多个值,使用@,因为我们要获取数组里的几个值(列表)。)

1.@animals[0,1];# gives("camel","llama");

2.@animals[0..2];# gives("camel","llama","owl");

3.@animals[1..$#animals];# gives all except the first element

这叫“数组切片”。

你可以在列表里干些有意义的事情:

1. my@sorted= sort@animals;

2. my@backwards= reverse@numbers;

有两个特殊的数组,一个是命令行传到你脚本的参数@ARGV;另一个是传递给子程序的参数@_。

*哈希

哈希用来表示键/值对:

1. my%fruit_color=("apple","red","banana","yellow");

你可以使用空白字符和=>操作符来美化上面的代码:

1. my%fruit_color=(

2. apple=>"red",

3. banana=>"yellow",

4.);

获取哈希元素:

1.$fruit_color{"apple"};# gives"red"

你可以通过keys()和values()来获取键列表和值列表。

1. my@fruits= keys%fruit_colors;

2. my@colors= values%fruit_colors;

哈希没有特定的内部排序,然而你可以对键进行排序来遍历它。

和特殊的标量、数组一样,哈希也有特殊的。我们现在只要知道哈希%ENV包括所有环境变量

更复杂的数据类型可以使用引用来构造,允许你把列表和哈希放到另一个列表和哈希中。

引用是一个标量值,它可以引用任何其它的Perl数据类型。通过把引用存储为数组或哈希的元素值,你可以轻松创建列表/哈希中的列表/哈希。

以下示例演示了使用匿名哈希引用实现的两级哈希结构

1. my$variables={

2. scalar=>{

3. description=>"single item",

4. sigil=>'$',

5.},

6. array=>{

7. description=>"ordered list of items",

8. sigil=>'@',

9.},

10. hash=>{

11. description=>"key/value pairs",

12. sigil=>'%',

13.},

14.};

15.

16. print"Scalars begin with a$variables->{'scalar'}->{'sigil'}\n";

变量作用域

上面所有的例子都使用这种语法:

1. my$var="value";

实际上,my不是必须的。你可以省略:(译注:前提是,你没有使用“use strict;”语句)

1.$var="value";

但是,上面的用法将创建一个全局变量,这是一个很差的编程实践。my创建一个词法作用域变量,这个变量只在定义它们的语句块中可见(比如一段包在大括号里的语句)。

1. my$x="foo";

2. my$some_condition= 1;

3. if($some_condition){

4. my$y="bar";

5. print$x;# prints"foo"

6. print$y;# prints"bar"

7.}

8. print$x;# prints"foo"

9. print$y;# prints nothing;$y has fallen out of scope

结合使用my和在Perl脚本开头使用use strict,解释器将捕获常见的编程错误。比如,在上面的例子中,最后的print$y将引发一个编译时错误并阻止程序运行。强烈建议使用use strict语句!

条件和循环语句

Perl有许多常用的条件和循环语句。Perl 5.10甚至提供了分支语句(拼作given/when)。

条件可以是任何Perl表达式。比较和布尔条件语句中常用的逻辑运算符,请参阅有关信息的下一节中的运算符的列表。

* if

1. if( condition){

2....

3.} elsif( other condition){

4....

5.} else{

6....

7.}

还有否定版本的:

1. unless( condition){

2....

3.}

这个否定版比if(!condition)更易读。

注意,大括号是必须的,即使代码块中只有一行。不过,这里有一个方法可以让你通过类似英语的语法来实现单行条件语句:

1.# the traditional way

2. if($zippy){

3. print"Yow!";

4.}

5.

6.# the Perlish post-condition way

7. print"Yow!" if$zippy;

8. print"We have no bananas" unless$bananas;

* while

1. while( condition){

2....

3.}

为了和unless同样的理由,也有一个否定版本:

1. until( condition){

2....

3.}

你也可以在后置条件里使用while:

print"LA LA LA\n" while 1;# loops forever

* for

跟C语言一样:

1. for($i= 0;$i<=$max;$i++){

2....

3.}

自然Perl提供了更友好的列表遍历循环foreach以后,C语言风格的for循环在Perl几乎不需要了。

* foreach

1. foreach(@array){

2. print"This element is$_\n";

3.}

4.

5. print$list[$_] foreach 0..$max;

6.

7.# you don't have to use the default$_ either...

8. foreach my$key(keys%hash){

9. print"The value of$key is$hash{$key}\n";

10.}

内置操作符和函数

Perl附带了各种各样的内置函数。我们已经看到的几个,包括print,sort和reverse。

Perl常见操作符(运算符)

*算术

1.+加法

2.-减法

3.*乘法

4./除法

*数字比较

1.==等于

2.!=不等于

3.<小于

4.>大于

5.<=小于等于

6.>=大于等于

*字符串比较

1. eq等于

2. ne不等于

3. lt小于

4. gt大于

5. le小于等于

6. ge大于等于

(为什么数字和字符串的比较运算符不同?因为我们没有不同的变量类型,并且Perl需要知道是以数字进行排序(99小于100)还是以字母进行排序(100在99前面))

*逻辑

1.&& and和

2.|| or或

3.! not否

*混合

1.=赋值

2..字符串连接

3. x字符串乘法

4...范围(建立一个列表)

一些操作符可以和=结合,像这样:

1.$a+= 1;# same as$a=$a+ 1

2.$a-= 1;# same as$a=$a- 1

3.$a.="\n";# same as$a=$a."\n";

文件和I/O

你可以使用open()函数来打开一个文件,用于输入或输出:

1. open(my$in,"<","input.txt") or die"Can't open input.txt:$!";

2. open(my$out,">","output.txt") or die"Can't open output.txt:$!";

3. open(my$log,">>","my.log") or die"Can't open my.log:$!";

你可以使用<>操作符从打开的文件句柄中读数据。在标量上下文中,它从文件句柄中读取一行;在列表上下文中,它读取整个文件,并将每一行作为列表的元素。

1. my$line=<$in>;

2. my@lines=<$in>;

一次性把整个文件读完,叫做“啜食(slurping)”。它能让人满意,但它可能是内存吞噬者。大多数文本文件处理可以通过Perl的循环结构,一行一行地完成。

<>操作符经常出现在while循环里:

1. while(<$in>){# assigns each line in turn to$_

2. print"Just read in this line:$_";

3.}

我们已经看到了如何使用print()在标准输出里打印。但是,print()还能通过第一个可选参数指定一个文件句柄来打印(译注:将内容输出到指定的文件句柄中,即写入到文件句柄相关联的文件中)

1. print STDERR"This is your final warning.\n";

2. print$out$record;

3. print$log$logmessage;

当你完成了对文件句柄的操作之后,你应该使用close()来关闭文件句柄。(老实说,如果你忘记关闭了,Perl会帮你处理。)

close$in or die"$in:$!";

正则表达式

Perl对正则表达式的支持宽广而深入:

*简单匹配

1. if(/foo/){...}# true if$_ contains"foo"

2. if($a=~/foo/){...}# true if$a contains"foo"

//匹配操作符(译注,完整的应该是:m//)默认操作$_,或者使用=~来绑定其它变量进行操作。

*简单置换

1. s/foo/bar/;# replaces foo with bar in$_

2.$a=~ s/foo/bar/;# replaces foo with bar in$a

3.$a=~ s/foo/bar/g;# replaces ALL INSTANCES of foo with bar in$a

*更复杂的正则表达式

你不仅能匹配固定的字符串。其实,你可以匹配任何你能想到的复杂正则表达式。

1..单个任意字符(默认不包含\n)

2.\s一个空白字符(空格, tab,换行,...)

3.\S一个非空白字符

4.\d一个数字(0-9)

5.\D一个非数字

6.\w一个能组成单词的字符(a-z, A-Z, 0-9, _)

7.\W一个不能组成单词的字符

8. [aeiou]匹配中括号内的任意一个字符

9. [^aeiou]匹配除了中括号内列出的字符之外的任意一个字符

10.(foo|bar|baz)匹配foo或bar或baz

11.

12. ^匹配开头

13.$匹配结尾

量词可用来指定数量:

1.*零个或任意多个

2.+至少一个

3.?零个或一个

4.{3} 3个

5.{3,6} 3到6个

6.{3,}至少3个

一些简单的例子:

1./^\d+/以一个或多个数字开头

2./^$/空的,没有任何东西

3./(\d\s){3}/ 3个带空白字符的数字

4.(比如"3 4 5")

5./(a.)+/匹配最少一次,含有a和任意字符

6.(比如"abacadaf")

7.

8.#从STDIN循环读入,并打印出非空白行:

9. while(<>){

10. next if/^$/;

11. print;

12.}

*圆括号捕捉

括号的另一个用法是分组。它可以用来捕捉最后使用的正则表达式匹配的结果。这些结果用$1、$2……表示。

1.# a cheap and nasty way to break an email address up into parts

2.

3. if($email=~/([^@]+)@(.+)/){

4. print"Username is$1\n";

5. print"Hostname is$2\n";

6.}

子程序

写一个子程序是很容易的:

1. sub logger{

2. my$logmessage= shift;

3. open my$logfile,">>","my.log" or die"Could not open my.log:$!";

4. print$logfile$logmessage;

5.}

现在我们可以像使用其它内置函数一样,使用该子程序了:

1. logger("We have a logger subroutine!");

什么是shift?传递给子程序的参数保存在@_数组中。shift函数的默认参数是@_。所以my$logmessage= shift;去掉第一个参数,并将其赋值给$logmessage。

可以通过别的方法操作@_:

1. my($logmessage,$priority)=@_;# common(通用)

2. my$logmessage=$_[0];# uncommon, and ugly(不通过,并且很丑陋)

子程序可以返回值:

# sub square{

# my$num= shift;

# my$result=$num*$num;

# return$result;

#}

然后像这样使用它:

1.$sq= square(8);

Perl面向对象

Perl面向对象相对比较简单,这是实现使用引用什么样的对象知道自己是在Perl的概念为基础的封装。

刚开始进行Perl编程,你最常使用的Perl面向对象将是使用第三方模块,参见下文。

使用Perl模块

Perl模块提供了一系列的功能,可帮助您避免重复劳动,它们可以通过CPAN(www.cpan.org)下载。许多流行的模块都已经包含在了Perl发行包中。

本文由无忧Perl(www.51perl.com)翻译,转载请注明本文链接:www.51perl.com/perl-brief-introduction/

水平有限,错误难免,欢迎指正,并以原文为准。原文地址:http://perldoc.perl.org/perlintro.html

希望对你有用

关于Perl语言入门的内容到此结束,希望对大家有所帮助。