gpt4 book ai didi

perl - 如何计算 Perl 中重叠的子字符串?

转载 作者:行者123 更新时间:2023-12-04 08:57:45 24 4
gpt4 key购买 nike

我需要实现一个程序来计算 perl 中字符串中子字符串的出现次数。我已经实现如下

sub countnmstr
{
$count =0;
$count++ while $_[0] =~ /$_[1]/g;
return $count;
}

$count = countnmstr("aaa","aa");

print "$count\n";

现在这是我通常会做的。但是,在上面的实现中,我想计算“aaa”中“aa”的出现次数。在这里我得到的答案为 1,这似乎是合理的,但我也需要考虑重叠的情况。因此,上述情况应给出答案为 2,因为如果我们考虑重叠,则有两个“aa”。

谁能建议如何实现这样的功能?

最佳答案

每个人的答案都变得非常复杂(天哪!daotoad 应该让他的评论成为答案!),也许是因为他们害怕山羊运算符(operator)。我没有给它命名,人们就是这么叫它的。它使用了一个技巧,即列表赋值的结果是右侧列表中的元素数。

用于计算匹配项的 Perl 习语是:

 my $count = () = $_[0] =~ /($pattern)/g;

山羊部分是 = () = ,这是两个分配中间的空列表。山羊的左侧部分从山羊的右侧获取计数。请注意,您需要在模式中进行捕获,因为这是匹配运算符将在列表上下文中返回的列表。

现在,您的情况下的下一个技巧是您真的想要一个积极的后视(或前瞻)。环视不消耗字符,因此您无需跟踪位置:
 my $count = () = 'aaa' =~ /((?<=a)a)/g;

您的 aaa只是一个例子。如果你有一个可变宽度的模式,你必须使用前瞻。 Perl 中的 Lookbehinds 必须是固定宽度的。

关于perl - 如何计算 Perl 中重叠的子字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2114185/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com