【问题标题】:Perl grep a range on values in an arrayPerl grep 数组中值的范围
【发布时间】:2016-07-19 10:10:28
【问题描述】:

文件内容:

Number of items Enabled:43
Number of items Enabled:95

用 grep 查找文件中 41-59 之间的任何值的命令

grep -E '5[1-9]|4[1-9]$' test.txt

返回

Number of items Enabled:43

我需要在具有相同内容的数组中做同样的事情。目前我正在使用以下命令返回一个特定的数字,但想查找相同的范围 41-59:

if (grep(/43/,  @TESTARRAY)) {}

我似乎无法正确理解语法

【问题讨论】:

  • 我认为您之前必须使用grep -E '(5[1-9]|4[1-9])$' test.txt,以便$ 与两个分支相关。

标签: regex perl grep


【解决方案1】:

这是因为正则表达式是关于模式而不是_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>;

您不应该尝试构建用于选择数字范围的正则表达式 - 它会让您发疯。

【讨论】:

  • “你不应该尝试构造一个正则表达式来选择一个数字范围——它会让你发疯”Number::Range::Regex 可以保持你的理智
【解决方案2】:

实际上并没有什么不同,请注意,您可以避免这种特定情况的交替:

print join " ", grep(/\b([45][0-9])$/ && $1 != 40, qw(12 18 41 52 40 59 64))

【讨论】:

    【解决方案3】:
    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 之间的数字

    【讨论】:

      猜你喜欢
      • 2011-04-07
      • 1970-01-01
      • 2020-01-19
      • 2011-09-20
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 2010-11-25
      • 2014-01-31
      相关资源
      最近更新 更多