繁体   English   中英

Perl grep数组中值的范围

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM