Perl 计算字符串中的序列

Perl 计算字符串中的序列,perl,hash,counting,Perl,Hash,Counting,我正在开发一个程序,它可以查看一行DNA,如果它发现一个X长度的单词,则计算有多少匹配项 假设你读了这样一行 AGGAACAAAAGGG my $word_length = 2; my %count; ##Counting code## %count = ( AG => 2, GG => 2, GA => 1, AC => 1, CA => 1, AA => 4, ); 当字长为2时,它应该将值存储在如下

我正在开发一个程序,它可以查看一行DNA,如果它发现一个X长度的单词,则计算有多少匹配项

假设你读了这样一行

AGGAACAAAAGGG
my $word_length = 2;
my %count;

##Counting code##

%count = (
    AG => 2,
    GG => 2,
    GA => 1,
    AC => 1,
    CA => 1,
    AA => 4,
);
当字长为2时,它应该将值存储在如下的散列中

AGGAACAAAAGGG
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个

for my $i (0..length($s)-$word_length) {
   my $word = substr($s, $i, $word_length);
   ++$counts{$word};
}

(散列包含多个计数,因此我将其重命名为
%counts

使用全局正则表达式匹配,这是最简洁的

下面的代码查找字符串
$s
中后跟两个“单词”字符(字母数字或下划线,如果数据表现良好,这应该足够)的所有位置,捕获
$1
中的这些字符,并递增
%计数
散列的相应字段。要捕获的字符数由插入正则表达式模式的
$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;
输出
你必须表现出一种尝试。Stackoverflow将帮助您解决编码问题,它不会为您编写代码。添加您的占位符代码,您将获得更好的帮助。谢谢,ikegami!这正是我需要的。