2014-01-12 34 views
0

我正在檢查一個正則表達式模式,對數組中的每一行STDIN foreach值。 我正在使用正則表達式模式中的數組中的值。因此,下面的示例應該匹配任何具有@nums中的三個數字之後加上另外6個數字的行。替代正則表達式模式foreach值在數組Perl中

my @nums = qw/ 
    509 
    544 
    555 
/; 

while(my $line = <>) { 
    chomp $line; 
    foreach my $num (@nums) { 
     if ($line =~ /$num\d{6}/) { 
      say $line; 
     } 
    } 
} 

輸入

504333322 
544009113 
509323232 
1509868333333 
443123432 
509999 
5599234 
410987655 

輸出

544009113 
509323232 
1509868333333 

這是工作爲我好,但我想知道,爲了提高性能,如果有辦法做到的同樣的事情沒有重複的正則表達式匹配。

謝謝。

+0

我們不知道什麼是'$ row [2]' –

+0

抱歉,錯字。我修好了它。 – BryanK

+0

好的,請參閱我的POST –

回答

1

以下 - 的TLP的上面評論的變化 - 在@nums創建一個使用值交替的正反向預搜索:

use strict; 
use warnings; 

my @nums = qw/ 
    509 
    544 
    555 
    /; 

my $ORnums = '(?<=' . (join '|', @nums) . ')'; 
my $regex = qr/$ORnums\d{6}/; 

while (<DATA>) { 
    print if /$regex/; 
} 

__DATA__ 
504333322 
544009113 
509323232 
1509868333333 
443123432 
509999 
5599234 
410987655 

輸出:

544009113 
509323232 
1509868333333 

希望這幫助!