Perl如何匹配多个目标项?正则计数仅返回1次结果如何解决
问题原因
代码计数错误的核心原因是匹配逻辑写法错误:
- 你使用
if语句搭配正则的/g全局匹配修饰符,if只会在第一次匹配成功时执行一次内部代码块,不会遍历文本中所有符合规则的匹配项,最终只捕获到第一个作者条目,计数结果固定为1。 - 其余代码逻辑不存在功能性错误,但存在不规范问题:未提前声明变量、用三参open打开文件更安全、正则硬解析HTML对格式变动容错性极低,这些问题不会触发本次计数错误,但会提高后续代码维护成本。
修复方案
将匹配逻辑的if替换为while循环即可:while会配合/g修饰符逐次迭代所有匹配结果,每命中一个作者条目就执行一次计数逻辑,就能得到正确的统计值。
修正后的完整可运行代码如下:
use strict; use warnings; my $text ='<span>by <small class="author" itemprop="author">J.K. Rowling</small><span>by <small class="author" itemprop="author">J.K. Rowling</small><span>by <small class="author" itemprop="author">J.K. Rowling</small>'; my %authorcount; # while遍历所有全局匹配结果 while ($text =~ m/<span>by <small class="author" itemprop="author">(.+?)<\/small>/ig){ my $author = $1; $authorcount{$author}++; } my $authorcounttxt = "authorcount.txt"; open (my $out_fh, ">", $authorcounttxt) or die "打开文件失败: $!"; foreach my $author (sort { $authorcount{$b} <=> $authorcount{$a} } keys %authorcount){ print $out_fh "$author $authorcount{$author}\n"; } close $out_fh;
运行效果
代码执行后写入authorcount.txt的结果和预期完全一致:
J.K. Rowling 3
优化提示:如果需要处理结构不固定的真实HTML内容,不要用正则硬匹配标签,建议使用专用的HTML解析库提取节点内容,避免标签属性顺序变化、多余空格、标签嵌套等情况导致匹配失效。
内容的提问来源于stack exchange,提问作者7akeoverforce
相关产品推荐
相关产品推荐

