[英]Perl grep a range on values in an array
文件内容:
Number of items Enabled:43
Number of items Enabled:95
命令在41-59之间grep输出文件中的任何值
grep -E '5[1-9]|4[1-9]$' test.txt
退货
Number of items Enabled:43
我需要在具有相同内容的数组中执行相同的操作。 目前,我正在使用以下命令返回特定数字,但希望查找41-59相同的范围:
if (grep(/43/, @TESTARRAY)) {}
我似乎无法正确理解语法
那是因为正则表达式是关于模式而不是_values的。 grep
根本不了解相对价值。
您需要先提取值:
#!/usr/bin/env perl
use strict;
use warnings;
while (<DATA>) {
if ( m/Enabled:(\d+)/
and $1 > 41
and $1 < 59 )
{
print;
}
}
__DATA__
Number of items Enabled:43
Number of items Enabled:95
grep
函数可以类似的方式使用:
print grep { m/Enabled:(\d+)/ and $1 > 41 and $1 < 59 } <DATA>;
您不应该尝试构建用于选择数字范围的正则表达式-它将使您陷入疯狂。
use strict;
use warnings;
while(<DATA>){
if ( m/.*?Enabled:(4[1-9])|(5[0-9])/){
print $_;
}
}
__DATA__
Number of items Enabled:43
Number of items Enabled:50
Number of items Enabled:52
Number of items Enabled:40
m/.*?Enabled:(4[1-9])|(5[0-9])/
1) .*?
是非贪婪的正则表达式,这意味着它将匹配所有内容,直到下一个元素
从您的正则表达式中找到(在本例中为“已启用”)
2) Enabled:
匹配字符串Enabled:
3) (4[1-9])|5[0-9])
3.1) (4[1-9])
将搜索4,后跟1-9之间的数字
|
要么
3.2) (5[0-9])
将搜索5,后跟0-9之间的数字
并没有什么不同,请注意,您可以在这种情况下避免更改:
print join " ", grep(/\b([45][0-9])$/ && $1 != 40, qw(12 18 41 52 40 59 64))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.