2016-08-16 97 views
2

我有一个DNA序列,例如ATCGATCG。我也有格式化的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排列,尽管它很挑剔。例如,就像['这篇文章'](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

如果将'$ highestsim'作为“相似性”的第三个参数传递,您应该看到性能提高 - 一旦相似性下降到给定限制以下,就会停止比较。 –

+0

有道理。我会添加它 –