regex - 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 有这些行
我的状态=通过
我的更新=测试
解决方案
好的,所以实际上没有人写过您的代码的实际问题。
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
推荐阅读
- ios - 从碰撞收集的 SCNNode 调用 Methode
- php - codeigniter rest_controller 响应中的 text/html 格式
- ios - 使用除 caf 之外的其他标题录制音频
- vba - 如何在 Outlook VBA 中的自定义表单属性上设置事件?
- automated-tests - 黄瓜场景和testng测试用例XML 1-1映射
- r - 如何设置 bashrc 文件以使 Ubuntu 终端使用我最新的 R 安装?
- python - 使用原始输入从数据集中索引 xarray DataArrays
- javascript - 如何将 javascript 代码包含到 php 视图中?
- javascript - 如何修复向上和向下页面上的多个导航
- java - 动态注册命令的参数解析/converter