You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 19:15:34