资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,PERL,在生物信息学中应用,主讲:吴茂英,生物信息学与生物统计学系,上海交通大学,1/51,主要内容,PERL,介绍,PERL,脚本编写,PERL,变量,Perl,语法,PERL,与正则表示式,PERL,示例,2/51,P,ERL,释义,Practical Extraction and Report Language,实用摘录和汇报语言,但它其实不是缩写,Larry Wall,,1987.12.18,Perl,历史,3/51,Perl,环境准备,Unix,:大多数内置,一些软件也内置perl,比如,apache/oracle,Windows,:ActivePerl5.10.0,4/51,Perl,工具,编辑工具:notepad,vi,IDE:Komodo,Perl Dev Kit,CGI:Top perl studio,Perl builder,perl edit,perlwiz,Mod_perl,5/51,Perl,功效,脚本语言,解释执行,无需编译,含有编译语言如c、Java功效,又有shell脚本方便,无数据类型区分,适于不太复杂程序,适于不要求速度,不在意内存CPU等系统资源任务,强大字符串处理功效,灵活或复杂正则表示式,大多数平台支持,除了专用模块,可在不一样平台运行,6/51,Perl,应用,Web,编程:,CGI,,,XML,处理,系统管理,网络编程(安全脚本),.,数据库管理,图像处理,其它众多领域。,7/51,一个示例,#!/usr/bin/perl,Print“This is my first perl programn”;,$a=;,Print$a;,第一行:,#!/usr/bin/perl,由什么程序执行以下内容,注释:,输入:,输出:,print,$a,:变量,无需指定数据类型,8/51,perl,四种变量,Scalar,:标量,以$开始,后面以字母或,_,开头,再后面能够是字母或数字,array,:数组,列表,以开头,Hash:哈希,散列,以%开头,文件:大写字母,区分大小写,,$Var,$VAR,$var,内置变量,$/,,,$,等,9/51,字符串变量,由双引号或单引号标识一组字符组成。,最少0个字符(“”为空串),最多能够占满内存,末尾不含null(0),“$string”=$str+“ing”!=$string,记住一些惯用转义字符,print“the$var is$var.”,注意单引号使用方法:不替换、不转义,$var=“str”;,print“this is$var”;,#”this is str”,print this is$var;#this is$var,10/51,变量初值,未创建时状态为,undef,,抵达文件尾也为,undef,说明变量为未定义:,undef$a;,用在条件判断中:,if(undef$a),代替不关心变量:,$s=“a:b:c:d,;($,a1,undef,undef,$d1)=split,(/:/,$,s);,假如有,undef,变量又不知在哪,可加,-w,参数进行提醒,#!/usr/bin/perl-w,创建后状态为,defined,普通用在条件判断中,if(defined$a),整数初值为,0,,字符串初值为空串,”,。普通未赋值就使用时,$result=$undefined+2;,11/51,相关函数,length(),:字符串长度,uc,lc,ucfirst,lcfirst,:改变大小写函数,substr,index,pos,:字符串函数,sin,等三角函数,rand(),srand(),:随机发生函数,$lastchar=chop($str)#,截去最终一个字符,$result=chomp($str)#,截去末尾行分隔符(通常为,”n”,),行分隔符由,$/,定义,12/51,控制结构,if(condition1),elsif(condition2)else,unless(),until(),do until(),while(),do while(),for(;),foreach,循环语句,13/51,foreach,语法:,foreach$w(list|array)statement,(),内能够是数组,a,,也能够是列表,(1,2,3),数组元素值能够修改,列表则是常量,$w,不影响原来已定义变量,$w,,循环结束后恢复,能够用,$a(a),用相同变量名称,示例:,foreach$a(a),用于数组,foreach$a(1,2,3,4),用于列表,foreach$k(keys%h),用于哈希,/,散列,foreach$a(a1,2,4),仅对数组部分元素,foreach(a),缺省循环变量为,$_,14/51,循环控制,last,:退出循环,next,:进入下一循环,redo,:重新执行此次循环,goto,:跳转,continuestatement,15/51,单行条件语句与循环语句,print$a if$a=0;,print$a unless($a=0);,print$a while($a-,=,0);,print$a until($a-=0),用|,&条件语句:,$a=0,open(F,file)|die“cant open”;,die,函数:在控制台标准错误输出信息后退出程序。,warn:,输出信息后不退出程序,只起警报作用。,$!:内部变量,包含错误代码。,$:内部变量,包含错误信息。,16/51,列表,数组形式,形式,:,(1,”a”,2.3,$a,$x+1),,其元素能够是数字、字符串、变量、表示式,空列表,(),,单元素列表,(2),不一样于标量,2,qw(1$a str),(),能够用其它符号表示,如,元素能够是数值、变量、不带引号字符串,中间用空格分开,17/51,范围表示列表,.,:范围运算符,每次增加,1,,如,1.3,(1.6)=(1,2,3,4,5,6),(1,2.5,6)=(1,2,3,4,5,6),(3.3)=(3),(2.4.5.3)=(2.4,3.4,4.4),(4.5.1.6)=(),(“aa”.”ad”)=(“aa”,”ab”,”ac”,”ad”),$month=(01.31),($a,$a+3)=(3,4,5,6)if$a=3,18/51,数组,列表存放,a=(1,2,3),,不一样于,$a,,初始值为,(),元素形式:,$a0,表示第一个元素,索引从,0,开始,,$a-1,表示倒数第一个元素,数组赋值:,a=(1,2,3,4);b=a;,b=(2,3);a=(1,a,4);,a=;#,从屏幕输入进行赋值,按下,CTRL-d,结束,改变元素值:,$a1=3;,超出数组大小元素赋值:,$a5=6;#,自动增加,其它元素为,NULL,读取不存在元素为空:,$b=$a6;,19/51,数组读出,a=(1,2,3);,$a=$a1;,($x,$y,$z)=a;,$x=1,$y=2,$z=3;,($x,$y)=a;,$x=1,$y=2;,($a,$b,$c,$d)=a;$a=1,$b=2,$c=3,$d=“”;,$a=a=$#a+1;#$a,为数组长度,,$#a,为数组最终一个元素索引,($a)=a;#,数组第一个元素,$a0,打印数组:,print a;#,元素直接相连,print“a”;#,元素之间用空格分开,20/51,数组片段,a=(1.5),sub=a0,1,3;,a1,3=(“a”,”b”);,b=(1,2,3);sub=ab;,a1,2=a2,1;,a1,2,3=a3,2,4;,21/51,数组操作函数,sort,:缺省按字母排序,$a,$b,表示数组元素,,_,代表数组本身,reverse a;#,取数组逆序,chop a;#,每个元素截去最终一个字符,shift(a);#,删除数组第一个元素并返回该值,缺省对,ARGV,数组,unshift(a);#,在数组头部添加元素,返回新数组长度,push(a,$a);#,在数组末尾添加元素,pop(a);#,删除数组末尾元素,22/51,数组操作函数(二),join(,连接符号,a),把数组连接为一个字串,a=(a,b);join(:,a)=“a:b”;,split(/,分隔符,/,分割串,长度,),分隔符:缺省为空格,可省略,分割串:缺省为,$_,,可省略,长度:可省略,缺省为全部分割,$s=“a,b,c”;a=split(/,/,$s);,a=(a,b,c);,a=split(/,/,$s,2);,a=(a,b,c);,23/51,数组函数(三),splice,函数:,ret=splice(a,skip,length,newlist);,对数组,a,进行操作,跳过,skip,个元素,然后用,newlist,替换,length,个元素,newlist,长度能够不为,length,,但其替换长度总为,length,假如,length=0,表示为插入;假如,newlist=(),则表示为删除,当,length,和,newlist,都省略时表示全部删除,found=grep(/pattern/,search),对数组,search,每个元素进行搜索匹配,pattern,,匹配元素返回到,found,map(expr,list),对数组,list,每个元素进行,expr,运算,返回运算后数组。元素用,$_,替换,如,map($_+1,(1,2),(2,3),24/51,二维数组,aoa=1,2,3,a,b,c;,该数组元素为两个数组,子数组访问:,$aoa-0,(1,2,3),子数组元素列表:,$aoa-00,1,2,子数组元素访问:,$aoa-00,a=(1,2,3);b=(a,b,c);,$aoa=a,b;$aoa-00;,25/51,关联数组:哈希,/,散列,关联数组表示:,%h=(1,a,2,b);,关联数组下标为关键字,key,,由,key,得到值为,value,上式意义是,%h=(1=a,2=b);,元素形式,$h1=a,26/51,关联数组赋值,%a=(“key1”,1,”key2”,2);,%h=a;,a=%h;,%h1=%h2;,($a,%h)=array;,%h=(%first,%second);,%h1=(%h2,k,v),函数返回:,%h=split();,keys=(a,b,c);hashkeys=hashreverse keys;,27/51,关联数组操作函数,keys(%hash),values(%hash),分别返回键和值列表,返回元素无次序,($key,$value)=each(%hash),效率高于先用,foreach$k(keys%h),再用,$hash$k,exists$hashkey,判断关键字是否存在,undef(%h),相当于删除散列,%h=();,delete,28/51,关联数组次序,foreach$w(sort keys(%hash)#,按照字符串排序,或者,foreach$w(sort$a$b keys(%hash)#,数值排序,29/51,文件,存放于磁盘,用于读写访问,访问前必须先打开文件,结束时关闭文件,open(HANDLE,“filename”)|die$!;,成功返回非零,失败返回零,HANDLE,:文件句柄,用来代表操作文件。以字母开头,字母、数字、下划线组成,普通用大写字母,缺省打开句柄,STDIN,STDOUT,STDERR,文件描述符为,0,,,1,,,2,。无须调用,open,就能够直接访问,STDIN,:键盘输入,控制台。,STDOUT,:屏幕,显示器。,STDERR,:错误输出,显示器。,30/51,文件访问模式,只读:,open(F,“filename”);,文件不存在则创建新文件,存在则清空重写,追加:,open(F,“filename”);,在存在文件后面追加内容,读写:,open(F,“+,,文件不存在则创建,存在则清空再写,读写:,+,,文件不存在则创建,存在则追加,管道:,|,,,open(F,“|cathello”);,把文件,F,输出,(print F$a),作为后输入。,open(F,“,comm,|”);,把,comm,输出作为,F,输入。以下内容只要读出。,comm,为命令。,31/51,文件缓冲,缓冲 无缓冲,打开:,open,sysopen,sysopen,关闭,close,读,readline,sysread,写,print,syswrite,定位,tell,seek,sysseek,32/51,读文件,$line=,读一行到,line,,指针后移一行。缺省读到$_中。$/=n,为行分隔符,碰到它则为一行结束,行包含$/。可用chomp($s)去除此标志,行尾不含$/则不去除字符。可设置$/为其它字符串,碰到$/为行结束,chomp去除此字符串。,array=,文件内容全部读出,每行为一个元素。含回车。,当从STDIN中读时,可省略为。,read(F,$in,len,$offset,)读入$in,sysread(,F,$in,len,$offset),getc(F),读,一个字符,33/51,命令行参数,ARGV,:全局,$ARGV0是第一个参数,不是程序名。,是对$ARGV引用。ARGV一旦赋值,原值丢失。,1。,第一次看到时,打开以$ARGV0中文件。无参数则打开STDIN读,。所以能够省略。,2。,shift(ARGV),元素数量降低一个。,3。,读打开文件中全部行。,4。再读第二个参数表示文件。,文件尾检测:eof和eof()。文件结束返回真。,ARGV(”file1”,”file2”);,while($line=),if(eof),print,eof,;,读取file1到末尾时,下一循环打开下一文件。,每次读完一个文件输出eof.,if(eof()print eof);,全部文件都读完才输出eof。,34/51,写文件,printf(“format str”,$a,$b);,同,c,中,printf,,格式化串包含,%m.nf,格式指示,后面依次是对应值列表。,print F(“str”);,F,文件句柄,后面为空格,省略,F,为,STDOUT,。,str,输出内容。可用单引号,,不进行变量替换,不加引号,计算出变量值再输出。,(),可省略。这是函数特点。,write,用于格式化输出。不是,read,对应操作。,syswrite(F,$data,length,$offset);,同,sysread,35/51,文件测试,op expr,if(-e“file1”)print STDERR(“file1n”);,文件是否存在。,-b,是否为块设备,-c,是否为字符设备,-d,是否为目录,-e,是否存在,-f,是否为普通文件,-g,是否设置了,setgid,位,-k,是否设置了,sticky,位,-l,是否为符号链接,-o,是否拥有该文件,-p,是否为管道,-r,是否可读,-s,是否非空,-t,是否表示终端,-u,是否设置了,setuid,位,-w,是否可写,-x,是否可执行,-z,是否为空文件,-A,距上次访问多长时间,-B,是否为二进制文件,-C,距上次访问文件,inode,多长时间,-M,距上次修改多长时间,-O,是否只为“真正用户”所拥有,-R,是否只有“真正用户”可读,-S,是否为,socket-T,是否为文本文件,-W,是否只有,“,真正用户,”,可写,-X,是否只有,“,真正用户,”,可执行,-s,返回文件长度,,-A-C-M,返回天数。,36/51,正则表示式,(,模式匹配,),检验匹配是否成功,=,字符串是否匹配模式,匹配则为真,没有匹配则为假。,!,不匹配为真,匹配为假。,regular expression,,规则表示式,模式匹配,在字符串中寻找特定序列字符。,指定模式:由斜线包含,,/def/,即模式,def,。,匹配操作符,=,、,!,$question=“expleaseding”,$question=/please/,$question!/edit/,37/51,正则表示式使用,if($question=/please/)print(Thank you for being polite!n);,else print(That was not very polite!n);,用于条件判断:,grep,:正则表示式只对简单变量匹配,假如是数组,a=/abc/,,则,2=/abc/,。用,grep(/abc/,a);,对数组中每个元素匹配。,split(/abc/,$line),依据模式匹配分割字符串。,模式匹配,3,种类型:,m/,模式匹配,,s/,匹配并替换,,tr/,逐一替换,翻译,38/51,模式匹配之一:元字符,+,一个或多个相同前导字符,(,模式,),。如:/de+f/指def、deef、deeeeef等。是对前一个匹配模式重复,不是匹配后字符重复。如/deE+/,匹配de,dee,dE,dEE,deE,dEe。不是匹配了e后再重复eee,就没有eE了。相当于/deEeEeE,/。,*,匹配,0,个、,1,个或多个相同字符,?,匹配,0,个或,1,个该前一个字符,.,匹配除换行外全部单个字符,通常与*适用,.*,全部任意数量字符。与前一字符结合,可不出现字符。相当于,.,匹配指定数目标字符,指定所匹配字符出现次数。如:,/de1,3f/,匹配,def,deef,和,deeef,;,/de3f/,匹配,deeef,;,/de3,f/,匹配不少于,3,个,e,在,d,和,f,之间;,/de0,3f/,匹配不多于,3,个,e,在,d,和,f,之间。,39/51,。,表示除其之外全部字符,如:,/ddeEf/,匹配,d,加非,d,e,E,字符加,f,字符串,模式匹配之二:选择,匹配一组字符中任一个。,/a0123456789c/,将匹配,a,加一个数字加,c,字符串。与,+,联合使用例:,/deE+f/,匹配,def,、,dEf,、,deef,、,dEdf,字符|指定两个或多个选择来匹配模式。每个选择都是一个匹配或一组。不是单个字符。如:/def|ghi/匹配def或ghi。/x|y+/匹配x或y+。,0-9 a-z A-Z /a0-9c/,匹配任意字母或数字,0-9a-zA-Z,例:检验数字表示正当性,if($number=/-?d+$|-?0 xXda-fa-F+$/)print($number is a legal integer.n);else print($number is not a legal integer.n);,其中,-?d+$,匹配十进制数字,,-?0 xXda-fa-F+$,匹配十六进制数字。,40/51,转义符和定界符,模式中包含通常被看作特殊意义字符,须在其前加斜线,。如:,/*+/,中,*,即表示字符*,而不是上面提到一个或多个字符含义。斜线表示为,/,。在,PERL5,中可用字符对,Q,和,E,来转义。从,Q,开始到,E,间字符为原始字符,无特殊含义。,d,任意数字,0-9 D,除数字外任意字符,0-9,w,任意单词字符,_0-9a-zA-Z W,任意非单词字符,_0-9a-zA-Z,s,空白,rtnf S,非空白,rtnf,例:,/da-z/,匹配任意数字或小写字母。,定界,:,或,A,仅匹配字符串首,$,或,Z,仅匹配字符串尾,b,匹配单词边界,B,单词内部匹配,/def/,只匹配行以,def,打头字符串,,/def$/,只匹配以,def,结尾字符串,结合起来,/def$/,只匹配字符串,def,$,和,A,Z,在多行匹配时使用方法不一样。,41/51,示例,例,1,:检验变量名类型:,if($varname=/$A-Za-z_0-9a-zA-Z*$/),print($varname is a legal scalar variablen);,elsif($varname=/A-Za-z_0-9a-zA-Z*$/),print($varname is a legal array variablen);,elsif($varname=/A-Za-z_0-9a-zA-Z*$/),print($varname is a legal file variablen);,else,print(I dont understand what$varname is.n);,例,2,:,b,在单词边界匹配:,/bdef/,匹配,def,和,defghi,等以,def,打头单词,但不匹配,abcdef,。,/defb/,匹配,def,和,abcdef,等以,def,结尾单词,但不匹配,defghi,,,/bdefb/,只匹配字符串,def,。注意:,/bdef/,可匹配,$defghi,,因为单词包含字母数字下划线,,,$,并不被看作是单词部分。,例,3,:,B,在单词内部匹配:,/Bdef/,匹配,abcdef,等,但不匹配,def,;,/defB/,匹配,defghi,等;,/BdefB/,匹配,cdefg,、,abcdefghi,等,但不匹配,def,defghi,abcdef,。,42/51,模式重用,当模式中匹配相同部分出现屡次时,可用括号括起来,,用,n来屡次引用,以简化表示式。,把匹配值存起来以后再用,,,和,+,模式重复不一样。,只在此次匹配可用,。,还能够在匹配外引用。,例,:,/d2(W)d21d2/匹配12-05-92,,,26.11.87,,,07 04 92等但不匹配12-05.92,注意:/d2(W)d21d2/不一样于/(d2)(W)121/,后者只匹配形如17-17-17字符串,而不匹配17-05-91等。,43/51,模式变量,在模式匹配后调用重用部分结果可用变量$n,,全部结果,,匹配模式用变量,$&,包含不在括号中。匹配处之前部分用变量$,匹配处之前部分用变量$。也可用列表一次取得。,$string=This string contains the number 25.11.;,$string=/-?(d+).?(d+)/;#匹配结果为25.11,$integerpart=$1;#now$integerpart=25,$decimalpart=$2;#now$decimalpart=11,$totalpart=$&;#now totalpart=25.11,$_=This string contains the number 25.11.;,result=/-?(d+).?(d+)/;匹配得到变量形成列表,可赋值给数组。,当匹配失败,$1内容不确定,可能是从前匹配内容。为防止匹配失败要进行是否匹配成功判断,或直接赋值。,($m1,$m2)=($name=/(ab).*(c)把()内匹配值直接赋与$m1,$m2,不改变$1值。,嵌套使用:/(aaa)*)/,最外层括号为$1,内层为$2,$3。,44/51,匹配选项,g,匹配全部可能模式,,依据懒惰规则不加,g只匹配一处。,返回到数组中。,matches=balata=/.a/g;#matches=(ba,la,ta),匹配循环:,每,次匹配记住上次位置,while(balata=/.a/g),$match=$&;,print($matchn);,结果为:,ba,la,ta,当要匹配字符串改变时重新开始搜索。,当使用了选项g时,可用函数pos来控制下次匹配偏移:,$offset=pos($string);下一个匹配开始位置,pos($string)=$newoffset;从此位置开始搜索匹配,45/51,匹配选项,i 忽略模式中大小写,:,/de/i 匹配de,dE,De和DE。,m,将待匹配串视为多行,,,符号匹配字符串起始或新一行起始;$符号匹配任意行末尾。,以,下例,只匹配第一行为,a,不然无匹配;,$line=a,b,c;,$line=/(.*)$/m;,s 将待匹配串视为单行。.能够匹配n。,/a.*bc/s匹配字符串axxxxx nxxxxbc,但/a.*bc/则不匹配该字符串。,o 仅,只执行一次变量替换,$var=1;$line=;,while($var;$var+;,第一次匹配1,第二次值为2,但仍匹配1。,x 忽略模式中空白。格式清楚,/d2(W)d2 1 d2/x,等价于,/d2(W)d21d2/,。,46/51,匹配符号优先级,象操作符一样,转义和特定字符也有执行次序,(),模式内存,+*?,出现次数,$b B,锚,|,选项,47/51,扩展匹配模式,(?pattern),,其中,c,是一个字符,,pattern,是起作用模式或子模式。,3,、,(?#,注释,),模式注释,PERL5,中能够在模式中用,?#,来加注释,如:,if($string=/(?i)a-z2,3(?#match two or three alphabetic characters)/.,1,、,(?:pattern),不存贮括号内匹配内容,括号内子模式将存贮在内存中,此功效即取消存贮该括号内匹配内容,如,/(?:a|b|c)(d|e)f1/,中,1,表示已匹配,d,或,e,,而不是,a,或,b,或,c,。,2,、,/(?option)pattern/,内嵌模式选项,通常模式选项置于其后,有四个选项:,i,、,m,、,s,、,x,能够内嵌使用,等价于,/pattern/option,。,/(?i)a-z+/=/a-z+/i,4,、,(?),取消贪婪,a12b38b /a.*b/,全部匹配,当,/a(.*?)b/,时匹配,a12b,。,一样有*,?,+?,?,x?,x,?,x,y?,48/51,扩展模式匹配,5,、/pattern(?=string)/必定和否定预见匹配.?=?!,匹配后面为string模式,相反,(?!string)匹配后面非string模式,如:,$string=25abc8;,$string=/abc(?=0-9)/;,$matched=$&;#$&为已匹配模式,为abc,不是abc8,例,1,。,$line=“block1 first block2 second block3 third”,$line=/blockd(.*?)(?=blockd|$)/g;print$1;,例,2,。使用,while,$line=begin begin begin;,while($line=/begin(.*?)(?=begin|$)/sg),push(blocks,$1);,49/51,替换操作,在替换部分可使用模式变量,$n,,如,s/(d+)/$1/,,但在替换部分不支持模式特殊字符,如,*,+,等,如,s/abc/def/,将把,abc,替换为,def,。,替换操作符选项:,g,i,m,o,s,x,e,e,替换字符串作为表示式。,e,选项把替换部分字符串看作表示式,在替换之前先计算其值,如:,$string=0abc1;,$string=s/a-zA-Z+/$#now$string=0abcabc1,s/pattern/replace/,,将字符串中与,pattern,匹配部分换成,replace,。替换字符串不是模式。如,$string=abc123def;,$string=s/123/456/;#now$string=abc456def;,50/51,翻译操作,tr/string1/string2/。string1中第一个字符替换为string2中第一个字符,把string1中第二个字符替换为string2中第二个字符,依这类推。如:$string=abcdefghicba;,$string=tr/abc/def/;#now string=defdefghifed,当string1比string2长时,其多出字符替换为string2最终一个字符;当string1中同一个字符出现屡次时,将使用第一个替换字符。,翻译操作符选项:,c,翻译全部未指定字符,,d,删除全部指定字符,,s,把多个相同输出字符缩成一个,$string=tr/d/c;,把全部非数字字符替换为空格。,$string=tr/t/d,;删除,tab,和空格;,$string=tr/0-9/cs,;把数字间其它字符替换为一个空格。,51/51,
展开阅读全文