从NCBI上下载一个fasta格式的文件,20条WRKY家族基因的蛋白序列,wrky.fasta
文件准备好了,我们想知道它的名称、描述和序列内容!有了这些信息,我们就可以做别的事情,比如判断它是DNA还是蛋白质啦,看看序列有多长,各种碱基或氨基酸比例:
其实这个程序仅适用于文件中只有一条fasta序列的情况
- #!/usr/bin/perl -w
- open FH, "<wrky.fasta";
- while (<FH>)
- {
- chomp;
- if(/^>/) # 如果这一行的开头是>,就说明是描述的一行,可以提取序列的名称和描述
- { # 从>开始到第一个空白出现为“名称”,之后的内容为“描述”
- ($display_name,$desc)=/>(.*?)\s(.*)$/;
- }
- # 如果这一行的开头不是>,则就是序列行。由于序列可以分为好几行,所以要把每一行的序列都连接起来。
- else
- {
- $seq.=$_;
- }
- }
- $seq_length =length($seq); # 计算序列的长度。
- if ($seq=~/[^atgcATGC]/) # 判断序列是DNA还是蛋白质
- {
- $seq_type="dna";
- }
- else {$seq_type="protein";}
- print <<EOF;
- sequence name: $display_name
- sequence description: $desc
- sequence type: $seq_type
- sequence length: $seq_length
- EOF
输出的结果:
- sequence name: gi|147605|gb|J01673.1|ECORHO
- sequence description: E.coli rho gene coding for transcription termination factor
- sequence type: dna
- sequence length: 1880
BioPerl做法:
在BioPerl中,把一整条序列的“信息”存放到某个序列对象里($seq_obj),通过该对象的一些属性和方法来获取所需要信息。
直接把整条序列“输入”到$seq_obj里,它要借助另外一个模块生成的对象:Bio::SeqIO对象
Bio::SeqIO模块可以打开、读取特定的序列文件,比如fasta文件,得到的结果是一个特殊的对象:SeqIO对象。
- use Bio::SeqIO; # 注意大小写
- use Bio::Seq; # 其实这句话可以不写,因为SeqIO模块“包括”了Seq模块
然后就可以创建一个SeqIO对象来读取文件(注意,SeqIO对象是用来读写文件使用的,而Seq对象是用来存放序列使用的),创建模块对象(Bio::SeqIO)+瘦箭头(->)+方法名(new),所有面向对象的模块(Bio::Seq,Bio::SeqIO)都有一个叫做new的方法,它的功能简单而且重要:创建一个新的对象。我们直接把SeqIO对象的创建与“赋值”合而为一。因为SeqIO对象是用来读取文件的(或写入文件,我们以后再说),所以你需要告诉Perl两件事:(1)你要读取的序列文件叫什么名字?然后把它“赋值”给-file!(2)你要读取的序列文件是什么格式?然后把它“赋值”给-format!
对于本例来说,我们要读取的序列文件叫做wrky.fasta,文件格式是fasta,所以我们要创建SeqIO对象可以这么写:
- $catchseq_seqio_obj = Bio::SeqIO->new(-file=>'wrky.fasta', -format=>'fasta'); # 注意,现在“打开“文件不是写成 open 了!
我们希望把完整的一条fasta序列读进Seq对象里($seq_obj),方法是:调用刚刚建立的SeqIO对象的next_seq方法。
- $seq_obj = $catchseq_seqio_obj->next_seq; # next_seq方法将返回一个Seq类型的对象,这里写作$seq_obj
现在,这条fasta序列的各种信息都已经存在$seq_obj里了,可以通过调用Seq对象的方法来获得需要的信息。
- $display_name = $seq_obj->display_name; # 序列的名称
- $desc = $seq_obj->desc; # 序列的描述
- $seq = $seq_obj->seq; # 序列字符串
- $seq_type = $seq_obj->alphabet; # 序列的类型(dna还是蛋白质?)
- $seq_length = $seq_obj->length; # 序列的长度
- # 其实对象$seq_obj的属性和方法还很多呢。比如,可以从里面截取一段序列,还可以求它的互补序列。
处理多条序列:
- while($seq_obj = $catchseq_seqio_obj->next_seq)
- {
- $display_name = $seq_obj->display_name; # 在这儿处理每个序列的信息
- $desc = $seq_obj->desc;
- $seq = $seq_obj->seq;
- $seq_type = $seq_obj->alphabet;
- $seq_length = $seq_obj->length;
- }
本文来自:http://blog.163.com/guojinyan2008@126/blog/static/3074706720111018112829613/