首页 > 解决方案 > perl grep 多重模式

问题描述

我正在尝试 grep 和匹配两种模式

if(grep /mystatus eq 'PASSED\||FAILED/ && /myupdate ne TEST/, @try) 那么它应该打印“ok”。但是它没有正确匹配。它打印“不匹配”。你能建议吗?提前致谢。

use strict;
use warnings;
open(FILE,"myfile");
my @file = <FILE>;


if(grep /mystatus eq 'PASSED\||FAILED/ && /myupdate ne TEST/, @file)
{
print "ok";
}
else
{
print "not matching\n";
}

myfile 有这些行

我的状态=通过

我的更新=测试

标签: regexperl

解决方案


好的,所以实际上没有人写过您的代码的实际问题。

grep 匹配一个条件。您正在指定//“匹配正则表达式”的意思,然后您不提供实际的正则表达式。

此外,您正在逃避您|的条件,因此您正在匹配文字。

print "This matches\n" if "myupdate ne TEST" =~ /myupdate ne TEST/;

这不会做你想做的事。

如果您确实想进行regex测试,则需要一些不同的东西,例如:

例如:

while ( <DATA> ) {
   print "Matching line $_" if m/mystatus=(PASSED|FAILED)/;
}

__DATA__
mystatus=PASSED
myupdate=TESTED

第二个问题是-您将文件读入@try基于行的拆分。所以这两种模式永远不会匹配,因为它们是分开评估的。

你可以采取几种方法来解决这个问题,但一种是设置“$/”,它是记录分隔符 - 设置为undef并且所有内容都被读入单个数组元素,但是......如果你然后啜饮它就会变得有点平庸成一个数组。

因此,我敦促您首先不要grep用于此任务 -grep非常适合根据条件过滤元素列表,但这实际上并不是您想要做的。

所以我建议你实际上应该做的根本不是grep,而是:

#!/usr/bin/env perl; 
use strict;
use warnings;
use Data::Dumper; 

my %values = map { /(\w+)=(\w+)/ } <DATA>;


#for debug
print Dumper \%values;

print "OK\n" if $values{'mystatus'} eq 'PASSED' and $values{'myupdate'} eq 'TESTED'; 

__DATA__
mystatus=PASSED
myupdate=TESTED

这将使用该map函数从输入文件中选择键值对,然后让您测试特定键的内容,就像您想要的那样。

或者使用您更复杂的逻辑:

#!/usr/bin/env perl; 
use strict;
use warnings;
use Data::Dumper; 

my %values = map { /(\w+)=(\w+)/ } <DATA>;


#for debug
print Dumper \%values;

print "OK\n" if ( $values{'mystatus'} eq 'PASSED' or $values{'mystatus'} eq 'FAILED' ) 
                   and $values{'myupdate'} eq 'TESTED'; 

__DATA__
mystatus=PASSED
myupdate=TESTED

推荐阅读