计算字符串中的序列

时间:2017-11-08 17:35:00

标签: perl hash counting

我正在研究一个查看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。

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;