2016-09-04 1 views
3

Ich verwende den folgenden Code, um den übereinstimmenden Wert von Grep-Funktion in Perl zu erhalten, aber es gibt immer einen Wert von 1 zurück, anstatt den übereinstimmenden Wert zurückzugeben.Finden übereinstimmende Zeichenfolge mit Grep gibt nicht den übereinstimmenden Wert

use strict;  
use warnings; 

my @capture = "err=\"some value\""; 

if(my @matched_string = (grep(/\berr\b/, @capture) || grep(/\bwarn\b/, @capture))){ 
    print "@matched_string"; 
} 

Wie kann ich den übereinstimmenden Wert erhalten.

+0

Wenn ich meine @matched_string = (grep (/ \ berr \ b /, @capture) nur, es funktioniert gut –

Antwort

3

Die OR (||) erlegt die Skalarkontext auf dem ersten (linken) grep Anruf. Also gibt es die Anzahl der Übereinstimmungen zurück, die dann für die Wahrheit ausgewertet wird. Wenn es mit dieser Zahl übereinstimmt, wird diese als wahr ausgewertet, sodass diese Zahl von || zurückgegeben wird. Andernfalls erhalten Sie die andere Liste oder eine leere Liste, falls diese auch keine Übereinstimmung hat.

Ich nehme an, dass Sie alle Zeilen mit err von @capture oder, wenn nicht zusammen, dann alle mit warn erhalten möchten. Dazu müssen Sie zuerst den vollen Pass für err machen, dann suchen Sie nach warn. Ein einfacher Weg,

my @matched_string = grep { /\berr\b/ } @capture; 
@matched_string = grep { /\bwarn\b/ } @capture if not @matched_string; 

Aber wenn Sie wollen einfach alle Saiten in @capture mit entweder err oder warn Worte in ihnen, dann

my @matched_string = grep { /\b(?:err|warn)\b/ } @capture; 

Bitte klären Sie den Zweck, wenn die obigen Annahmen nicht richtig sind.

+0

kann ich den obigen Ausdruck mit @matched_string = (grep (/ \ berr \ b ersetzen || \ bwarn \ b /, @capture) –

+0

@SudhirMishra Nun, ja - aber das wird dir alle Zeichenfolgen in '@ capture' geben, die _either_' err' _or_ 'warn' Wörter in ihnen haben. Ist es das was du willst ? – zdim

+0

@SudhirMishra Ich habe es zu der Antwort hinzugefügt, lass es mich wissen, wenn es nicht das ist, was du meinst. – zdim

2
#Perform the assignment first then do the "or" as follows 
#or combine the regex to achieve what you are trying to achieve: 


use strict; 
use warnings; 

my @capture = "err=\"some value\""; 
my @matched_string; 
if ((@matched_string = grep(/\berr\b/, @capture)) || (@matched_string =  grep(/\bwarn\b/, @capture))) { 
    print "@matched_string"; 
} 



#Another alternative (combining the regex) 


use strict; 
use warnings; 

my @capture = "warn\"some value\""; 

if ((my @matched_string = grep(/\b(err|warn)\b/, @capture))) { 
    print "@matched_string"; 
} 
Verwandte Themen