2014-01-12 3 views
0

배열의 STDIN foreach 값의 각 줄에 대해 정규식 패턴을 검사합니다. 정규 표현식 패턴에서 배열의 값을 사용하고 있습니다. 따라서 아래 예제는 @nums에있는 세 개의 숫자 중 하나에 6 개의 숫자가 더해진 행과 일치해야합니다.regex 패턴 대신 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

OK, 내 POST 참조 –

답변

1

하는 것은 다음 - 위의 코멘트에 TLP 's의 변화 - 만듭니다 값을 사용하여 교대의 긍정적 인 lookbehind @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 

희망이 도와 줘요!