Perl基础教程--精华篇

Posted 生信人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl基础教程--精华篇相关的知识,希望对你有一定的参考价值。

一、文件 

存放于磁盘,用于读写访问,访问前必须先打开文件,结束时关闭文件。

1、基本写法:

open(HANDLE,“>filename”)||die$!; 

成功返回非零,失败返回零 

HANDLE:文件句柄,用来代表操作的文件。以字母开头,字母、 数字、下划线组成,一般用大写字母 缺省打开的句柄STDIN,STDOUT,STDERR,文件描述符为0,1,2。 不必调用open就可以直接访问 。STDIN:键盘输入,控制台。

STDOUT:屏幕,显示屏。

STDERR:错误输出,显示屏。 \

2、文件访问模式 

只读:open(F,“<filename”);或者open(F,“filename”);文件不存在 则打开失败

只写:open(F,“>filename”);文件不存在则创建新文件,存在则 清空重写 

追加:open(F,“>>filename”);在存在的文件后面追加内容 

读写:open(F,“+<filename”);可读可写,文件不存在则失败,否 则覆盖原文件; 读写:+>,文件不存在则创建,存在则清空再写 读写:+>>,文件不存在则创建,存在则追加

3、打开: open,sysopen;关闭 close 

读 <>,readline  写 print  定位 tell,seek 

读文件 $line=<file>读一行到line,指针后移一行。缺省 读到$_中。

$/=‘\n',为行分隔符,遇到它则为 一行结束,行包含$/。可用chomp($s)去除此标 志,行尾不含$/则不去除字符。可设置$/为其 他字符串,遇到$/为行结束,chomp去除此字 符串。

@array=<file>文件内容全部读出,每行为一个 元素。含回车。 当从STDIN中读时,可省略为<>。 

@ARGV:全局,$ARGV[0]是第一个参数,不是程序名。 <>是对$ARGV的引用。@ARGV一旦赋值,原值丢失。 第一次看到<>时,打开以$ARGV[0]中的文件。无参数则打开STDIN读。 所以可以省略。shift(@ARGV),元素数量减少一个;<>读打开的文件中的所有行;再读第二个参数表示的文件。 文件尾检测:eof和eof()。文件结束返回真。 

printf(“format str”,$a,$b…)格式化串包含%m.nf 的格式指示,后面依次是相应的值列表。 

4、测试 

if(‐e“file1”){print STDERR (“file1\n”);}文件是否存在。 

‐b是否为块设备 

‐c是否为字符设备

‐d是否为目录

‐e是否存在

‐f是否为普通文件

‐l是否为符号链接 

‐o是否拥有该文件 

‐r是否可读

‐s是否非空

‐t是否表示终端

-w是否可写

‐x是否可执行

‐z是否为空文件 

‐A距上次访问多长时间

‐B是否为二进制文件

‐M距上次修改多长时间 

‐O是否只为“真正的用户”所拥有 

‐R是否只有“真正的用户”可读 

‐T是否为文本文件 

‐W是否只有“真正的用户”可写

‐X是否只有“真正的用户”可执行 

‐s 返回文件长度,‐A‐M返回天数。

二、 正则表达式(模式匹配) 

在字符串中寻找特定序列的字符。 指定模式:由斜线包含,/def/即模式def。 

匹配操作符 =~、!~ 

检验匹配是否成功 =~字符串是否匹配模式,匹配则为真,没有匹配则为 假。

!~不匹配为真,匹配为假。 

$question=“expleaseding” $question =~ /please/

$question!~/edit/ 

1、正则表达式的使用 

用于条件判断: 

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///逐一替换,翻译 模式匹配之一:

2、元字符 + 一个或多个相同的前导字符(模式)。如:/de+f/指def、deef、 deeeeef等。是对前一个匹配模式的重复,不是匹配后的字符 的重复。如/d[eE]+/,匹配de,dee,dE,dEE,deE,dEe。不是匹配了 e后再重复eee,就没有eE了。相当于/d[eE][eE][eE]…/。 

3、* 匹配0个、1个或多个相同字符 ;?:匹配0个或1个该前一个字符 .

4、"."匹配除换行外的所有单个字符,通常与*合用 .*所有任意数量 字符。与前一字符结合,可不出现字符。相当于.... 匹配指定数目的字符 

5. {}指定所匹配字符的出现次数。如:/de{1,3}f/匹配def,deef和 deeef;/de{3}f/匹配deeef;/de{3,}f/匹配不少于3个e在d和f之 间;/de{0,3}f/匹配不多于3个e在d和f之间。 

6、选择 []:匹配一组字符中的任一个。/a[0123456789]c/将匹配a加一个数字加c的字 符串。与+联合使用例:/d[eE]+f/匹配def、dEf、deef、dEdf 。

7、[^]表示除其之外的所有字符,如:/d[^deE]f/匹配d加非d,e,E字符加f的字符串

8、 [0‐9][a‐z][A‐Z]/a[0‐9]c/匹配任意字母或数字

9、字符"|"指定两个或多个选择来匹配模式。每个选择都是一个匹配或一组。不是 单个字符。/def|ghi/匹配def或ghi。/x|y+/匹配x或y+。 

例:检验数字表示合法性

if($number=~/^‐\d+$|^‐0[xX][\da‐fa‐F]+$/){

print("$numberis alegal integer.\n");

}else{

print("$number is not a legal integer.\n");

其中 ^‐\d+$匹配十进制数字,^‐0[xX][\da‐fa‐F]+$匹配十六进制数字。 

10、转义符 

模式中包含通常被看作特殊意义的字符,须在其前加斜线"\"。如: /\*+/中\*即表示字符*,而不是上面提到的一个或多个字符的含义。斜 线的表示为/\\/。

在PERL5中可用字符对\Q和\E来转义。从\Q开始到\E间 的字符为原始字符,无特殊含义。 

\d任意数字 [0‐9]

\D除数字外的任意字符 [^0‐9] 

\w任意单词字符

\W任意非单词字符

\s空白 [\r\t\n\f]

\S非空白 [^\r\t\n\f] 

例:/[\da‐z]/匹配任意数字或小写字母。

11、 定界:

^或 \A仅匹配字符串首 

$或 \Z仅匹配字符串尾

\b匹配单词边界

\B单词内部匹配 

/^def/只匹配行以def打头的字符串,/def$/只匹配以def结尾的字符串, 结合起来的/^def$/只匹配字符串def 

^$和\A,\Z在多行匹配时用法不同。 示例

例1:检验变量名的类型:

if($varname =~/^\$[A‐Za‐z][_0‐9a‐zA‐Z]*$/){

print("$varname is a legal scalar variable\n"); 

}elsif ($varname =~/^@[A‐Za‐z][_0‐9a‐zA‐Z]*$/){ 

print("$varname is a legal array variable\n"); 

} elsif ($varname =~ /^[A‐Za‐z][_0‐9a‐zA‐Z]*$/) { 

print ("$varname is a legal file variable\n"); 

} else { print ("I don't understand what $varname is.\n");

例2:\b在单词边界匹配:/\bdef/匹配def和defghi等以def打头的单词,但不匹 配abcdef。/def\b/匹配def和abcdef等以def结尾的单词,但不匹配defghi, /\bdef\b/只匹配字符串def。注意:/\bdef/可匹配$defghi,因为单词包括字母数 字下划线 , $并不被看作是单词的部分。

例3:\B在单词内部匹配:/\Bdef/匹配abcdef等,但不匹配def;/def\B/匹配 defghi等;/\Bdef\B/匹配cdefg、abcdefghi等,但不匹配def,defghi,abcdef。 

12、模式的重用 

当模式中匹配相同的部分出现多次时,可用括号括起来,用\n 来多次引用,以简化表达式。 把匹配的值存起来以后再用,和+模式的重复不同。 只在本次匹配可用。还可以在匹配外引用。

例:/\d{2}([\W])\d{2}\1\d{2}/匹配12‐05‐92,26.11.87,070492 等但不匹配12‐05.92 注意:/\d{2}([\W])\d{2}\1\d{2}/不同于/(\d{2})([\W])\1\2\1/, 后者只匹配形如17‐17‐17的字符串,而不匹配17‐05‐91等。 

13. 模式变量 

在模式匹配后调用重用部分的结果可用变量$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。

匹配选项 g匹配所有可能的模式,根据懒惰规则不加g只匹配一处。返回到数组中。 @matches="balata"=~/.a/g;#@matches=("ba","la","ta") 匹配的循环:

每次匹配记住上次的位置:

while("balata"=~/.a/g){ 

$match=$&;

print("$match\n"); 

结果为: ba la ta 

当要匹配的字符串改变时重新开始搜索。 

14、匹配选项g,

可用函数pos来控制下次匹配的偏移:

$offset=pos($string);

下一个匹配开始的位置 pos($string)=$newoffset;

从此位置开始搜索匹配 

15、匹配选项 i

忽略模式中的大小写:/de/i 匹配de,dE,De和DE。 

m将待匹配串视为多行,

^符号匹配字符串的起始或新的一行的起始;

$符号匹配任 意行的末尾。

以下例只匹配第一行为a,否则无匹配;

$line='a b c'; 

$line=~/^(.*)$/m;

16、匹配选项s

将待匹配串视为单行,.可以匹配\n。

/a.*bc/s匹配字符串axxxxx \nxxxxbc,但/a.*bc/则不匹配该字符串。

17、匹配选项 x

忽略模式中的空白 。格式清晰 /\d{2}([\W])\d{2}\1\d{2}/x等价于/\d{2}([\W])\d{2}\1\d{2}/。 

18、匹配符号的优先级

象操作符一样,转义和特定字符也有执行次序

()模式内存

+?*{} 出现次数

^$\b\B锚

| 选项

19、 扩展匹配模式

1)取消贪婪:使用?

"a12b38b"

/a.*b/全部匹配

当/a(.*?)b/时匹配a12b。

2)/pattern(?=string)/

肯定的和否定的预见匹配.?=?! 匹配后面为string的模式,

相反的,(?!string)匹配后面非string的模式 ,如: $string?=?"25abc8"; $string?=~?/abc(?=[0‐9])/; $matched?=?$&;?#?$&为已匹配的模式,为abc,不是abc8 

例1。$line=“block1 first block2 second block3 third” 

$line=~/block\d(.*?)(?=block\d|$)/g;

print $1; 

例2。使用while

$line="begin<data1>begin<data2>begin<data3>";

while($line=~/begin(.*?)(?=begin|$)/sg) {

push(@blocks,$1);

3)替换操作

s/pattern/replace/,将字符串中与pattern匹配的部分换成replace。

替代字符 串不是模式。如

$string="abc123def"; 

$string=~s/123/456/;#now $string="abc456def"; 

在替换部分可使用模式变量$n(如$1,$2...),如

s/(\d+)/[$1]/,但在替换部分不 支持模式的特殊字符,如{},*,+等,如s/abc/[def]/将把abc替换为 [def]。 

替换操作符的选项:

g,i,m,o,s,x,e e替换字符串作为表达式。

e选项把替换部分的字符串看作表达式,在 替换之前先计算其值,如: 

$string="0abc1"; 

$string=~s/[a‐zA‐Z]+/$&x2/e;#now $string="0abcabc1" 

20、翻译操作

tr/string1/string2/。string1中的第一个字符替换为string2 中的第一个字符,把string1中的第二个字符替换为 string2中的第二个字符,依此类推(核酸序列A与T等互换操作)。如:

$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;把数字间的其它字符替换为一个空格。

$sequence =~ tr/ACGTUNacgtun/TGCAANtgcaan/d;###常用的核酸序列取互补序列了

至此perl基础知识全部讲完,下次将讲解具体实例。

预告一下下次主题:FASTA序列相关操作。欢迎关注!


以上是关于Perl基础教程--精华篇的主要内容,如果未能解决你的问题,请参考以下文章

单体架构转向微服务架构-基础篇+精华视频教程

(转)Perl基础教程一

常用网站网址(个个都是精华)

PHP入门基础教程

Python数据科学精华实战课程|Python数据科学视频教程

(基础篇) 正则表达式详解