Perl中的RegEx仅计算第一个实例

时间:2017-08-04 19:37:37

标签: regex perl hash count

我有一个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;
        }
    }
}

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:0)

我认为你错过了" g" (全局)修饰符 - 你试过(g加粗): if($ _ =〜/(警告|错误)/ g i){