2011-03-02 2 views
5

여러 패턴 검사에이 방법을 사용하지 않도록 할 수있는 방법이 있습니까?Perl에서 여러 패턴 일치를 확인하는 방법

배열의 모든 패턴을 제거하고 패턴 배열의 패턴과 일치하는지 확인할 수 있습니까? 20 개 이상의 패턴 문자열이있는 경우를 생각해보십시오.

if( ($_=~ /.*\.so$/) 
    || ($_=~ /.*_mdb\.v$/) 
    || ($_=~ /.*daidir/) 
    || ($_=~ /\.__solver_cache__/) 
    || ($_=~ /csrc/) 
    || ($_=~ /csrc\.vmc/) 
    || ($_=~ /gensimv/) 
){ 
    ... 
} 
+0

@Eric okay .. 그 일을하지 못해 죄송합니다. – Arovit

답변

11

Perl 버전 5.10을 사용할 수 있다면 정말 쉬운 방법이 있습니다. 새로운 smart match (~~) 연산자를 사용하십시오.

use warnings; 
use strict; 
use 5.10.1; 

my @matches = (
    qr/.*\.so$/, 
    qr/.*_mdb\.v$/, 
    qr/.*daidir/, 
    qr/\.__solver_cache__/, 
    qr/csrc/, 
    qr/csrc\.vmc/, 
    qr/gensimv/, 
); 

if($_ ~~ @matches){ 
    ... 
} 

Perl 5.10을 사용할 수없는 경우 List::MoreUtils::any을 사용합니다.

use warnings; 
use strict; 
use List::MoreUtils qw'any'; 

my @matches = (
    # same as above 
); 

my $test = $_; # copy to a named variable 

if(any { $test =~ $_ } @matches){ 
    ... 
} 
+1

smartmatch는 이제 시험용으로 표시되며 더 이상의 통지없이 제거되거나 변경됩니다. (5.26에서 이런 소리가 나올 것입니다.) 후자의 해결책은 여러분의 Perl 버전에 관계없이 사용해야합니다. – ikegami

4

또 다른 사전 펄 5.10 옵션은 패턴 목록을 한 번에 원래 모든 조건을 테스트 한 정규식로 결합되는, Regexp::Assemble이다.

+0

이것은 특히 패턴이 여러 값에 대해 테스트 된 경우 훨씬 더 효율적입니다. 정규식 검색을 시작하는 것은 사실 상당히 비쌉니다. – ikegami

1

원래 코드는 다음과 같이 더 잘 쓸 수 있었다 :

$_ =~ /foo/ 그냥 /foo/과 동일하기 때문이다
if( /.*\.so$/ 
    || /.*_mdb\.v$/ 
    || /.*daidir/ 
    || /\.__solver_cache__/ 
    || /csrc/ 
    || /csrc\.vmc/ 
    || /gensimv/ 
) { ... } 

. Perl 5.10 이상인 경우 Brad가 제안한 스마트 매치 연산자를 사용합니다.