您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > PERL语言入门实战习题
《Perl语言入门实战习题》一、计算FASTA文件中每条序列的长度;输入文件,FASTA格式:注:如果输入文件在windows下产生,在Linux系统下操作时,宜先用dos2unix处理:用法:dos2unix输入文件输出文件:Perl代码:#!/usr/bin/perl-wusestrict;unless(@ARGV==2){#@ARGV传给脚本的命令行参数列表dieUsage:perl$0input.faout.len\n;#当命令行参数不是2的时候输出使用说明}my($infile,$outfile)=@ARGV;#把命令行参数赋值给输入文件和输出文件openIN,$infile||dieerror:can'topeninfile:$infile;#打开输入文件句柄INopenOUT,$outfile||die$!;#打开输出文件句柄OUT$/=;IN;#设置输入记录分隔符为””,并去除第一个””while(my$seq=IN){#把序列ID行和序列赋值给$seqmy$id=$1if($seq=~/^(\S+)/);#获取序列IDchomp$seq;#去掉末尾的””$seq=~s/^.+?\n//;#删除第一行$seq=~s/\s//g;#删除序列中的空白字符my$len=length($seq);#计算序列长度printOUT$id\t$len\n;#输出结果到输出文件}$/=\n;#把输入记录分隔符改为默认值closeIN;#关闭输入文件句柄closeOUT;#关闭输出文件句柄二、计算FASTA文件中每条序列的GC含量;输入文件同上,输出文件:Perl代码:#!/usr/bin/perl-wusestrict;unless(@ARGV==2){#@ARGV传给脚本的命令行参数列表dieUsage:perl$0input.faout.gc\n;#当命令行参数不是2的时候输出使用说明}my($infile,$outfile)=@ARGV;#把命令行参数赋值给输入文件和输出文件openIN,$infile||dieerror:can'topeninfile:$infile;#打开输入文件句柄INopenOUT,$outfile||die$!;#打开输出文件句柄OUT$/=;IN;#设置输入记录分隔符为””,并去除第一个””while(IN){#$_=IN,把序列ID行和序列赋值给$_,$_=可以省略不写my$id=$1if(/^(\S+)/);#获取序列IDchomp;#去掉末尾的””s/^.+?\n//;#删除第一行s/\s//g;#删除序列中的空白字符my$GC=(tr/GC/GC/);#计算G或C碱基个数my$AT=(tr/AT/AT/);#计算A或T碱基个数my$len=$GC+$AT;#计算序列非N长度my$gc_cont=$len?$GC/$len:0;#计算GC含量,如果长度为0,GC含量算0printOUT$id\t$gc_cont\n;#输出结果到输出文件}$/=\n;#把输入记录分隔符改为默认值closeIN;#关闭输入文件句柄closeOUT;#关闭输出文件句柄三、求反相互补序列;输入文件同上,输出文件也是FASTA格式Perl代码:#!/usr/bin/perl-wusestrict;unless(@ARGV==2){#@ARGV传给脚本的命令行参数列表dieUsage:perl$0input.faout.gc\n;#当命令行参数不是2的时候输出使用说明}my($infile,$outfile)=@ARGV;#把命令行参数赋值给输入文件和输出文件openIN,$infile||dieerror:can'topeninfile:$infile;#打开输入文件句柄INopenOUT,$outfile||die$!;#打开输出文件句柄OUT$/=;IN;#设置输入记录分隔符为””,并去除第一个””while(IN){#$_=IN,把序列ID行和序列赋值给$_,$_=可以省略不写my$id=$1if(/^(\S+)/);#获取序列IDchomp;#去掉末尾的””s/^.+?\n//;#删除第一行s/\s//g;#删除序列中的空白字符$_=reverse$_;#序列方向tr/ATCG/TAGC/;#序列互补printOUT$id\n,$_,\n;#输出结果到输出文件}$/=\n;#把输入记录分隔符改为默认值closeIN;#关闭输入文件句柄closeOUT;#关闭输出文件句柄四、列表信息整合;输入列表1:序列长度文件输入文件2:序列测序覆盖深度文件输出文件:把上述两个列表的信息整合成一个列表,并且最后一行给出汇总结果:Perl代码#!/usr/bin/perl-wusestrict;(@ARGV==3)||dieUsage:perl$0list1list2combine.list\n;#当命令行参数不是3的时候输出使用说明my($infile1,$infile2,$outfile)=@ARGV;#把命令行参数赋值给输入文件1、输入文件2和输出文件my%id_len;#定义一个哈希openIN1,$infile1||die$!;#打开第一个文件句柄while(IN1){my($id,$len)=split/\s+/,$_;#split函数用空白符号切割每一行的内容$id_len{$id}=$len;#哈希赋值:id=length}closeIN1;#关闭第一个文件句柄openIN2,$infile2||die$!;#打开第2个文件句柄openOUT,$outfile||die$!;#打开输出文件句柄my$tol_len=0;#定义总长度变量,并赋值为0my$tol_depth=0;#定义总深度变量,并赋值为0while(IN2){my($id,$depth)=split;#split函数用空白符号切割每一行的内容my$len=$id_len{$id};#序列长度printOUTjoin(\t,$id,$len,$depth),\n;#输出整合信息到输出文件$tol_len+=$len;#长度累加$tol_depth+=$len*$depth;#深度累加}$tol_depth/=$tol_len;#计算总体平均深度printOUTTotal\t$tol_len\t$tol_depth\n;#输出汇总结果到输出文件closeIN2;#关闭第二个输入文件句柄closeOUT;#关闭输出文件句柄五、串流程;Perl在工作中常用于串流程,现有同事写了3个perl脚本分三步将输入文件,infile.txt处理成最终的final.result:第1步:perlstep1.plinfile.txtoutput1第2步:perlstep2.plinfile.txtoutput2第3步:perlstep3.ploutput1output2final.result为提高工作效率,现需要写一个脚本使用infile.txt作为输入文件,直接得到final.result,中间产生的文件结果不保留。#!/usr/bin/perl-wusestrict;unless(@ARGV==2){#@ARGV传给脚本的命令行参数列表dieUsage:perl$0infileout.result\n;#当命令行参数不是2的时候输出使用说明}my($infile,$outfile)=@ARGV;#把命令行参数赋值给输入文件和输出文件my$temp_file=“temp.$$”;#临时文件,$$为进程号,这样可以保证文件名字的唯一性system“perlstep1.pl$infile$temp.1perlstep2.pl$infle$temp.2perlstep3.pl$temp.1$temp.2$outfilerm$temp.1$temp.2”#使用system调用3个perl脚本进行处理
本文标题:PERL语言入门实战习题
链接地址:https://www.777doc.com/doc-7770104 .html