我有一个包含多个连续String序列的字符串,例如:
my $ substring =“ CAG”; 我的$ str =“ CAGCAGCAGCAGPGHSMCAGCAG”;
我要计算str中的最大重复子串。
答案 0 :(得分:2)
my $substring = 'CAG';
my $str = 'CAGCAGCAGCAGPGHSMCAGCAG';
# look for a series of consecutive $substring not followed later by a longer such series
my ($longest_substring) = $str =~ /((?:\Q$substring\E)+)(?!.*?\1\Q$substring\E)/s;
my $repetitions = length($longest_substring // '') / length($substring);
答案 1 :(得分:1)
在列表上下文中带有/g
修饰符的匹配运算符将返回所有匹配项。为了对它们进行计数,我们可以对结果施加标量上下文:
my @matches = $str =~ /$substring/g;
my $count = scalar @matches;
返回6。
它可以进一步缩短为
my $count = () = $str =~ /$substring/g;
在() =
赋值强制列表上下文的情况下,但将其赋给标量变量则强制标量上下文。
请注意,如果匹配项重叠,例如,这不会报告正确的数字
my $str = 'CACACAC';
my $substring = 'CAC';
上面的表达式将返回2,因为与/g
的匹配开始搜索最后一个匹配结束的下一个匹配。要解决此问题,请使用不消耗匹配部分的先行断言:
my $count = () = $str =~ /(?=$substring)/g;
答案 2 :(得分:0)
尝试一下:
my $number = () = $str =~ /$substring/gi;
print $number;