我有一个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;
}
}
}
答案 0 :(得分:3)
您只需检查是否存在warning
或error
。如果两者都可以在$_
中出现,或者如果它们可以出现多次,则需要执行更多操作。
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){