簡體   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