Perl 计算字符串中的序列
我正在开发一个程序,它可以查看一行DNA,如果它发现一个X长度的单词,则计算有多少匹配项 假设你读了这样一行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时,它应该将值存储在如下
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!这正是我需要的。