我正在研究一个查看DNA线的程序,如果找到X长度的单词,则计算多少匹配。
说你读了这样的一行
AGGAACAAAAGGG
如果字长为2,它应该将值存储在像这样的哈希
中my $word_length = 2;
my %count;
##Counting code##
%count = (
AG => 2,
GG => 2,
GA => 1,
AC => 1,
CA => 1,
AA => 4,
);
(这是手动计数,所以可能是错误的)。 这个“计数代码”,我没有,说明了重叠。这就是我正在努力的方向。我目前有占位符代码,但无法检测到重叠。 基本上,
“AAAA”,应该返回3 AA,而不是2。
答案 0 :(得分:2)
for my $i (0..length($s)-$word_length) {
my $word = substr($s, $i, $word_length);
++$counts{$word};
}
(哈希包含多个计数,因此我将其重命名为%counts
。)
答案 1 :(得分:1)
使用全局正则表达式匹配最简洁。
以下代码查找字符串$s
中所有后跟两个“单词”字符的位置(字母数字或下划线,如果数据表现良好,则应该足够)在{{1}中捕获这些字符并递增$1
哈希的相应字段。要捕获的字符数由%counts
表示,它被插入到正则表达式模式
请注意,$n
出现三次,而不是两次,因为子序列GG
包含两次出现
GGG
use strict;
use warnings 'all';
use Data::Dumper;
my $s = 'AGGAACAAAAGGG';
my $n = 2;
my %counts;
++$counts{$1} while $s =~ /(?=(\w{$n}))/g;
print Dumper \%counts;