使用grep查找匹配的字符串不会返回匹配的值

时间:2016-09-04 08:20:27

标签: regex perl

我使用下面的代码从perl中的grep函数中获取匹配的值,但它总是返回值1而不是返回匹配的值。

use strict;    
use warnings; 

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

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

我如何获得匹配的值。

2 个答案:

答案 0 :(得分:3)

OR(||)在第一个(左)grep调用上强制执行标量上下文。所以它返回匹配的次数,然后评估真实性。如果它匹配任何数字的计算结果为true,那么该数字将由||返回。否则你得到另一个列表,或者如果那个列表没有匹配则列出一个空列表。

我认为你希望从err得到@capture的所有行,或者如果完全不存在,则全部使用warn。为此,您首先获得err的完整传递,然后查找warn。一个简单的方法

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

但如果您只是希望@capture中的所有字符串中包含errwarn个字词,那么

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

如果上述猜测不对,请澄清目的。

答案 1 :(得分: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";
}