PERL语言入门实战习题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《Perl语言入门实战习题》

一、计算FASTA文件中每条序列的长度;

输入文件,FASTA格式:

注:如果输入文件在windows下产生,在Linux系统下操作时,宜先用dos2unix处理:

用法:dos2unix输入文件

输出文件:

Perl代码:

#!/usr/bin/perl-w

use strict;

unless(@ARGV==2){#@ARGV传给脚本的命令行参数列表

die"Usage:perl$0\n";#当命令行参数不是2的时候输出使用说明}

my($infile,$outfile)=@ARGV;#把命令行参数赋值给输入文件和输出文件

open IN,$infile||die"error:can't open infile:$infile";#打开输入文件句柄IN

open OUT,">$outfile"||die$!;#打开输出文件句柄OUT

$/=">";;#设置输入记录分隔符为”>”,并去除第一个”>”

while(my$seq=){#把序列ID行和序列赋值给$seq

my$id=$1if($seq=~/^(\S+)/);#获取序列ID

chomp$seq;#去掉末尾的”>”

$seq=~s/^.+?\n//;#删除第一行

$seq=~s/\s//g;#删除序列中的空白字符

my$len=length($seq);#计算序列长度

print OUT"$id\t$len\n";#输出结果到输出文件

}

$/="\n";#把输入记录分隔符改为默认值

close IN;#关闭输入文件句柄

close OUT;#关闭输出文件句柄

二、计算FASTA文件中每条序列的GC含量;

输入文件同上,输出文件:

Perl代码:

#!/usr/bin/perl-w

use strict;

unless(@ARGV==2){#@ARGV传给脚本的命令行参数列表

die"Usage:perl$0\n";#当命令行参数不是2的时候输出使用说明}

my($infile,$outfile)=@ARGV;#把命令行参数赋值给输入文件和输出文件

open IN,$infile||die"error:can't open infile:$infile";#打开输入文件句柄IN

open OUT,">$outfile"||die$!;#打开输出文件句柄OUT

$/=">";;#设置输入记录分隔符为”>”,并去除第一个”>”

while(){#$_=,把序列ID行和序列赋值给$_,$_=可以省略不写my$id=$1if(/^(\S+)/);#获取序列ID

chomp;#去掉末尾的”>”

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含量算0 print OUT"$id\t$gc_cont\n";#输出结果到输出文件

}

$/="\n";#把输入记录分隔符改为默认值

close IN;#关闭输入文件句柄

close OUT;#关闭输出文件句柄

三、求反相互补序列;

输入文件同上,输出文件也是FASTA格式

Perl代码:

#!/usr/bin/perl-w

use strict;

unless(@ARGV==2){#@ARGV传给脚本的命令行参数列表

die"Usage:perl$0\n";#当命令行参数不是2的时候输出使用说明}

my($infile,$outfile)=@ARGV;#把命令行参数赋值给输入文件和输出文件

open IN,$infile||die"error:can't open infile:$infile";#打开输入文件句柄IN

open OUT,">$outfile"||die$!;#打开输出文件句柄OUT

$/=">";;#设置输入记录分隔符为”>”,并去除第一个”>”

while(){#$_=,把序列ID行和序列赋值给$_,$_=可以省略不写my$id=$1if(/^(\S+)/);#获取序列ID

chomp;#去掉末尾的”>”

s/^.+?\n//;#删除第一行

s/\s//g;#删除序列中的空白字符

$_=reverse$_;#序列方向

tr/ATCG/TAGC/;#序列互补

print OUT">$id\n",$_,"\n";#输出结果到输出文件

}

$/="\n";#把输入记录分隔符改为默认值

close IN;#关闭输入文件句柄

close OUT;#关闭输出文件句柄

四、列表信息整合;

输入列表1:序列长度文件

输入文件2:序列测序覆盖深度文件

输出文件:把上述两个列表的信息整合成一个列表,并且最后一行给出汇总结果:

Perl代码

#!/usr/bin/perl-w

use strict;

(@ARGV==3)||die"Usage:perl$0\n";

#当命令行参数不是3的时候输出使用说明

my($infile1,$infile2,$outfile)=@ARGV;

#把命令行参数赋值给输入文件1、输入文件2和输出文件

my%id_len;#定义一个哈希

open IN1,$infile1||die$!;#打开第一个文件句柄

while(){

my($id,$len)=split/\s+/,$_;#split函数用空白符号切割每一行的内容

$id_len{$id}=$len;#哈希赋值:id=>length

}

close IN1;#关闭第一个文件句柄

open IN2,$infile2||die$!;#打开第2个文件句柄

open OUT,">$outfile"||die$!;#打开输出文件句柄

my$tol_len=0;#定义总长度变量,并赋值为0

my$tol_depth=0;#定义总深度变量,并赋值为0

while(){

my($id,$depth)=split;#split函数用空白符号切割每一行的内容

my$len=$id_len{$id};#序列长度

print OUT join("\t",$id,$len,$depth),"\n";#输出整合信息到输出文件

$tol_len+=$len;#长度累加

$tol_depth+=$len*$depth;#深度累加

}

$tol_depth/=$tol_len;#计算总体平均深度

print OUT"Total\t$tol_len\t$tol_depth\n";#输出汇总结果到输出文件

close IN2;#关闭第二个输入文件句柄

close OUT;#关闭输出文件句柄

五、串流程;

Perl在工作中常用于串流程,现有同事写了3个perl脚本分三步将输入文件,infile.txt处理成最终的final.result:

第1步:perl step1.pl infile.txt output1

第2步:perl step2.pl infile.txt output2

第3步:perl step3.pl output1output2final.result

相关文档
最新文档