用perl语言测DNA序列,全部分给你!

问题描述:

用perl语言测DNA序列,全部分给你!
首先先说说,DNA的碱基由ATCG四种碱基组成,假如有一段碱基序列,里面有未知的碱基,我们把未知的碱基命名为N.
假如现在有一段碱基序列:ATCGNATCGNAATTCGGNTTGGANATTCGGATGCCNTATCUACGTATNGNTCGATGCNGT
这一段包含着N(也就是未知碱基)的序列我们称之为scaffod
现在我们对scafford上的碱基一个一个地看,逢遇到N就将它剔除,这时,我们会得到很多段小序列,如:ATCG ATCG AATTCGG ……,这些子序列我们称之为contig
现在我们按碱基数的由大到小排列contig
从最长的一列一直往较小一列递加下去,直到加到某一列后,碱基数的总和是所有contig碱基数总和的50%及以上,那一列我们称之为N50
同理,若加到某一列,碱基数的总和是所有contig碱基数总和的90%及以上,那一列我们称之为N90
现在要请用perl语言设计一个算法,测出N50、N90、最长contig的碱基数、最短contig的碱基数、所有contig连起来后的(G+C)/(A+T+G+C)的比例

#!usr/bin/perl -w
use strict;
use 5.010;
#打开DNA序列文件句柄
open FILE,"contig"
my %hash;
#读入序列
my $DNA = ;
#按照"N"来拆分序列,并且剔除"N"
my @list = split(/N/,$DNA);
#总长度
my $whole_len = 0;
#最长和最短
my $max = rindex $list[0]."\$","\$";;
my $min = rindex $list[0]."\$","\$";;
foreach(@list){
#取得长度
my $len = rindex $_."\$","\$";
if($max $max = $len;
}
if($min > $len){
$min = $len;
}
# 长度=>contig
$hash{$len} = $_;
$whole_len += $len;
}
#输出最长contig的碱基数和最短contig的碱基数
say "最长contig的碱基数:$max\n";
say "最短contig的碱基数:$min\n";
#求 N50 和 N90
my $links;
my $temp_len;
foreach my $key(reverse sort keys %hash){
$links .= $hash{$key};
$temp_len += $key;
if($temp_len > $whole_len/2){
say "N50是 :$links\n";
}
elsif($temp_len > $whole_len*9/10){
say "N90是 :$links\n";
}
}
#求(G+C)/(A+T+G+C)的比例
my @list_all = split(//,$DNA);
my ($num_A,$num_T,$num_G,$num_C);
foreach(@list_all){
if($_ eq "A"){
$num_A++;
}
if($_ eq "T"){
$num_T++;
}
if($_ eq "G"){
$num_G++;
}
if($_ eq "C"){
$num_C++;
}
}
my $a = ($num_G+$num_C)/($num_A+$num_T+$num_G+$num_C);
say "(G+C)/(A+T+G+C) = $a";
算法已经测试过了,没啥问题.你需要把DNA序列存在 DNA.txt里面就可以了.然后我只是想帮帮你而已,分数又不能吃饭.