【问题标题】:RegEx in perl only counting first instanceperl 中的 RegEx 仅计算第一个实例
【发布时间】:2018-01-12 20:01:52
【问题描述】:

我有一个foreach 循环来遍历我的日志文件。就我所拥有的,它只会接受第一个接受的正则表达式实例,然后再继续下一行。

我正在尝试计算警告或错误的每个实例并将计数保存到哈希表中。截至目前,我只能从存储的每一行中获取 1 个实例。

foreach $_(@logs){

    #regex to find instances of Warning/Error
    if($_ =~ /(warning|error)/i){

        #adding count to either Warning/Error
        if($1 eq "Warning" or $1 eq "warning"){
            $faultCodes{"WARNING"} += 1;
        }
        else{
            $faultCodes{"ERROR"} += 1;
        }
    }
}

【问题讨论】:

标签: regex perl hash count


【解决方案1】:

我认为您缺少“g”(全局)修饰符 - 您是否尝试过(g 粗体): if($_ =~ /(警告|错误)/gi){

【讨论】:

  • if (//g) 毫无意义! (好吧,如果你有一个展开的while (//g) 是有意义的,但这里不是这样。)
  • 我的意思不是字面上的“//g”,我的意思不是“/gi”,我认为这在代码示例中很明显 - 我已经更新了我的答案以反映这一点。跨度>
  • 你没有抓住重点。 if($_ =~ /(warning|error)/gi) 完全没有意义。
【解决方案2】:

您只需检查warningerror 是否存在。如果两者都可以在$_ 中出现,或者它们可以多次出现,则您需要做更多的事情。

for (@logs) {
   ++$faultCodes{ WARNING } while /warning/gi;
   ++$faultCodes{ ERROR   } while /error/gi;
}

for (@logs) {
   $faultCodes{ WARNING } += () = /warning/gi;
   $faultCodes{ ERROR   } += () = /error/gi;
}

在第一个 sn-p 中,我们在标量上下文中使用 //g 迭代所有匹配项,为每个匹配项递增计数器。

在第二个 sn-p 中,我们在列表上下文中使用 //g 来获取所有匹配项,然后在标量上下文中使用列表分配来计算它们。

【讨论】:

    猜你喜欢
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多