一步一步教你学习Perl

Posted 生信人

tags:

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

perl在处理字符串方面优势明显,尽管目前好多人推荐写Python,但从目前来说好多流程都是用perl来写的,你周围也有好多人用perl,所以今天小编讲一下,怎么写perl。

今天主题为处理FASTA序列相关脚本。


1、根据序列ID提取相应的序列


#! /usr/bin/perl 

use Bio::SeqIO;###载入模块,use XXX

my $genome=$ARGV[0];

my $seqID=$ARGV[1];

my $seq=$ARGV[2];

my %hash;

my @ID;

###ARGV数组为系统默认数目,用于从屏幕依次读入数据,分别存储到第一个元素,第二个元素,第三个元素;然后本处分别赋给了三个变量。

open (OUT1, ">$seq")|| die "cannot open $seq:$!";

###打开输出文件写法。注意双引号中“>”,与下面的打开输入文件(打开文件为“<”)区别。

open (IN2, "<$seqID")|| die "cannot open $seqID:$!";

###打开输入文件写法。

my $ina = Bio::SeqIO->new(-file =>$genome, -format => 'fasta');

while(my $obj = $ina->next_seq()){

        my $id = $obj->id;

        my $seq = $obj->seq;

      $hash{$id}=$seq;

}

###上面的为Bio::SeqIO这一模块的用法;$id和$seq存储了序列的ID和序列;以ID为键,序列为值,存储到哈希中;所谓哈希可以简单认为是一个对应关系,如身份证号->小编。注意一个身份证号只能对应小编我一个人(换句话说你是不可能同时拥有两个身份证号的),这是哈希的基本准则。存储到哈希好处是我可以随便根据ID调出对应的序列。

while(<IN2>){###读取要提取的ID的文件了,<>表示按行读取

   next if(/^$/);###跳过空行。^行的首端;$行的末端

   my @tmp=split;###将行进行分割,分隔符号为空格或者tab,然后存储临时数组中

     push @ID, @tmp;###将数组@tmp进一步移入到@ID数组中

}

for($i=0;$i<=$#ID;$i++){###for循环了

print OUT1 ">$ID[$i]\n$hash{$ID[$i]}\n";###哈希用上;

}

close OUT1;###关闭文件

close IN1;###关闭文件

close IN2;###关闭文件


2、计算序列长度脚本


#! /usr/bin/perl 

use Bio::SeqIO;

my $seq=$ARGV[0];

my $Len=$ARGV[1];

open (OUT, ">$Len")|| die "cannot open $Len:$!";

my $ina = Bio::SeqIO->new(-file => $seq, -format => 'fasta');

while(my $obj = $ina->next_seq()){

        my $id = $obj->id;

        my $seq = $obj->seq;

       my seq_len=length($seq);

       print OUT ">$id\t$seq_len\n";

}

close OUT;

####本例与上例高度相似,只是使用了之前讲述的函数length;

3、提取指定位置序列脚本

#! /usr/bin/perl 

use Bio::SeqIO;

my $POS=$ARGV[0];

####输入要求:

###ID start stop strand

###seq1 100 300 +

my $SEQ=$ARGV[1];

my $Subseq=$ARGV[2];

my %hash;

my @position;

open (IN1, "<$POS")|| die "cannot open $POS:$!";

open (OUT, ">$Subseq")|| die "cannot open $Subseq:$!";


while (<IN1>){

my @tmp=split;

        push @position, [@tmp];

}

my $ina = Bio::SeqIO->new(-file => $SEQ, -format => 'fasta');

while(my $obj = $ina->next_seq()){

          my $id = $obj->id;

          my $seq = $obj->seq;

  $hash{$id}=$seq;

}

for($i=0;$i<=$#position;$i++){

  my  $ID=">$position[$i][0]_$position[$i][1]";

my $len=$position[$i][2]-$position[$i][1]+1;

  my $extract_seq=substr($hash{$position[$i][0]},$position[$i][1]-1,$len);

###substr字符串操作函数

if($position[$i][3] eq "-"){

$extract_seq=reverse_complementary($extract_seq);

}

print OUT "$ID\n$extract_seq\n";

}

close IN1;

close OUT;


####子函数写法

sub reverse_complementary{

my ($inputseq)=@_;

my $sequence = reverse(substr($inputseq,0));

$sequence =~ tr/ACGTUNacgtun/TGCAANtgcaan/d;

$inputseq=substr($sequence, 0);

return $inputseq;

}#####反向互补序列的输出!



你 GET到了吗?不懂请留言!


以上是关于一步一步教你学习Perl的主要内容,如果未能解决你的问题,请参考以下文章

一步一步教你YAML快速入门

一步一步教你制作的第一个 WordPress 插件

一步一步教你制作的第一个 WordPress 插件

02~ 一步一步教你使用 SVN之SVN 的介绍

一步一步教你制作的第一个 WordPress 插件

一步一步教你反向传播的样例