2017-08-04 37 views
1

我有一個foreach依次通過我的日誌文件進行迭代。用我所擁有的,它只會接受第一個接受的正則表達式的實例,然後再轉到下一行。正則表達式在Perl只計算一審

我想指望警告或錯誤的每個實例和計數保存到一個哈希表。截至目前,我只能從每行存儲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; 
     } 
    } 
} 
+1

這有幫助嗎? https://stackoverflow.com/questions/6969208/help-understanding-global-flag-in-perl – digitaLink

回答

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在列表環境讓所有的比賽,然後用列表分配在標量上下文指望他們。

+0

謝謝!這工作很好。 – SWarner

0

我想你錯過了 「G」(全球)修改器 - 你試過(粗體G): 如果($ _ =〜/(警告|錯誤)/ 我) {

+0

'如果(//克)'沒有任何意義! (好吧,如果你有一個展開的'while(// g)'是有意義的,但這裏不是這樣的。) – ikegami

+0

我並不是指字面意思是「// g」,我的意思是「t」/ gi「我認爲從代碼示例中很明顯 - 我已經更新了我的答案以反映這一點。 – combatc2

+0

你錯過了這一點。 '如果($ _ =〜/(警告|錯誤)/ gi)'完全沒有意義。 – ikegami