我使用下面的代码从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";
}
我如何获得匹配的值。
答案 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
中的所有字符串中包含err
或warn
个字词,那么
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";
}