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基础教程--精华篇的主要内容,如果未能解决你的问题,请参考以下文章