我有一个字符串($info
),看起来像这样:
$info = "Complete1:1,ATTCGGCTAGGGCTAGCTAGCTAG,Complete1:2,ATTTGAGAGGGATCGCGCCAT,..."
一个看起来像这样的数组(@codes
):
@codes = ("ACTTTCGGGGCATCGGATCG", "ATTGCATGGGCATGGCATGGCATG", "ACGGGATGGGCATGCTAG",...);
数组@codes
包含一些与$info
(一个或多个)部分匹配的元素以及一些与$info
不匹配的元素。
计算@codes
中所有元素匹配字符串$info
的次数的最快方法是什么?谢谢!
答案 0 :(得分:1)
这样做有两种方法:
my $pat = join '|', map quotemeta, @codes;
my $re = qr/,(?:$pat),/;
for my $info (...) {
my $padded_info = ",$info,";
my $count; ++$count while $padded_info =~ /$re/g;
...
}
或
my %codes = map { $_ => 1 } @codes;
for my $info (...) {
my $count = grep $codes{$_}, split /,/, $info;
...
}
我列出了代码,好像在@codes
中检查了多个字符串代码。重用计算值来自实际节省的地方。
我会将基准测试和微优化留给您,因为这将取决于您的数据和使用模式。
答案 1 :(得分:0)
性能可能不是很好,取决于源字符串的大小,但如果需要,您可以稍后进行优化。
my %results;
for my $code (@codes) {
my $count = () = $info =~ /$code/g;
$results{$code} = $count;
}