我想使用perl在序列文件中找到模糊匹配,并返回字符串中的字符编号,在该字符串中找到匹配的给定数量的替换(假设S = 2) . 例如,如果我的输入文件是:

Name1
ACTGTGACCTTT
Name2
ACCTTTACTGTG
Name3
GACCTTTCTGTG
Name4
GCACCTTTTGTG
Name5
GCTACCTTTGTG
Name6
ACTGACCTTTTG
Name7
ACTGTACCTTTG
Name8
ACCTTTACCTTT
Name9
ACTGTGACTGTG

我的搜索查询是“ACCTTT” .

然后我想我的输出是这样的:

Name1
6
Name2
0
Name3
1
Name4
2
Name5
3
Name6
4
Name7
5
Name8
0    6

我试过用String :: Approx做这个,但是这个模块只返回我匹配查询的数组的每个元素的第一个索引 . 此模块似乎也是错误的,即使我将插入和删除的数量设置为0,并允许2次替换,它仍然返回具有多于2个替换的匹配的索引 .

这是我正在使用的代码(如果有什么我不明白这个模块) .

#!/usr/bin/perl -w

use String::Approx 'aindex';

my $input_fasta=$ARGV[0];
open(IN,"<$input_fasta") || die ("Error opening $input_fasta $!");
my $l = 0;
my @names;
my @seqs;
while (<IN>){
    if ($l % 2 == 0 ){
    push (@names, $_);
    }
    elsif ($l % 2 ==1) {
    push (@seqs, $_);
    }
    $l++;
}

my @hits = aindex("ACCTTT", ["I0", "D0", "S2"], @seqs);

$hl=0;

foreach (@hits){
    if ($_ != -1){
    print "$names[$hl]$_\n";
    $hl++
    }
    else {
    $hl++;
    }
}

但这只会回归:

Name1
6
Name2
0
Name3
1
Name4
1
Name5
1
Name6
0
Name7
5
Name8
0