2016-08-16 4 views
2

私は、例えばATCGATCGのようなDNA配列を持っています。次のように私はまた、フォーマットされたDNA配列のデータベースを持っている:Perl:文字列の最高一致率を返す

>Name of sequence1 
SEQUENCEONEEXAMPLEGATCGATC 
>Name of sequence2 
SEQUENCETWOEXAMPLEGATCGATC 

(だから、奇数行は名前が含まれ、偶数行が配列を含む) は現在、私は私のシーケンスとの間の完全な一致を検索します以下のデータベース内のシーケンスは、(すべての変数が宣言されていると仮定):

my $name; 
my $seq; 
my $returnval = "The sequence does not match any in database"; 
open (my $database, "<", $db1) or die "Can't find db1"; 
until (eof $database){ 
    chomp ($name = <$database>); 
    chomp ($seq = <$database>); 
    if (
     index($seq, $entry) != -1 
     || index($entry, $seq) != -1 
    ) { 
     $returnval = "The sequence matches: ". $name; 
     last; 
    } 
} 
close $database; 

私は、エントリとの間であり、最も高い割合マッチしたシーケンスの名前だけでなく、パーセント一致を返すためにどのような方法がありますデータベース内のシーケンス?

+1

データベースのサイズはどれくらいですか? – Zaid

+0

['String :: Approx'](https://metacpan.org/pod/String::Approx)があなたを助けてくれるかどうか不明です。 – Zaid

+1

文字列を分割して、charでcharにすることができます。例えば、それは['this post'](http://stackoverflow.com/questions/9106978/perl-partial-match)で行われています。より良い、モジュールを見つける - たとえば、['Text :: Fuzzy'](http://search.cpan.org/~bkb/Text-Fuzzy-0.24/lib/Text/Fuzzy.pod)はそれを行うべきです。 – zdim

答えて

3

String::Similarityは、文字列間の類似度を0と1の間の値として返します.0は完全に似ていません.1はまったく同じです。

my $entry = "AGGUUG" ; 
my $returnval; 
my $name; 
my $seq; 
my $currsim; 
my $highestsim = 0; 
my $highestname; 
open (my $database, "<", $db1) or die "Can't find db1"; 
until (eof $database){ 
    chomp ($name = <$database>); 
    chomp ($seq = <$database>); 
    $currsim = similarity $entry, $seq, $highestsim; 
    if ($currsim > $highestsim) { 
     $highestsim = $currsim; 
     $highestname = $name; 
    } 
} 
$highestsim = $highestsim * 100; 
my @names = split(/>/, $highestname); 
$returnval = "This sequence matches " . $names[1] . " the best with " . $highestsim . "% similarity"; 
close $database; 
+1

'similarities'の3番目の引数として' $ highestsim'を渡すとパフォーマンスが向上するはずです。類似度が指定された制限値を下回ると比較を中止します。 –

+0

意味があります。私はそれを追加します –

関連する問題