2011-03-02 18 views
5

Çoklu desen kontrolleri için bunu kullanmanın bir yolu var mı?Perl'de çoklu desen eşleşmesi nasıl kontrol edilir

Dizideki tüm kalıpları kırabilir miyim ve desen dizisindeki herhangi bir desenle eşleşip eşleşmediğini kontrol edebilir miyim? Lütfen 20'den fazla desen dizgisi olduğunda durumu dikkate alın.

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

@Eric okay .. bunu yapmamış olduğum için özür dilerim – Arovit

cevap

11

Perl 5.10 sürümünü kullanırsanız, bunu yapmanın gerçekten kolay bir yolu vardır. Sadece yeni smart match (~~) operatörünü kullanın. Perl 5.10 kullanamıyorsanız

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){ 
    ... 
} 

, o zaman List::MoreUtils::any kullanmak.

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'in deneysel olarak işaretlendiğini ve * daha fazla uyarı yapılmadan * silineceğini veya değiştirileceğini unutmayın. (Bunun gibi sesler 5.26'da gerçekleşecektir.) İkinci çözüm Perl versiyonunuza bakılmaksızın kullanılmalıdır. – ikegami

4

Başka öncesi Perl 5.10 seçenek kalıpları listesi almak ve bir kerede özgün koşulların tümü test edecek tek bir regex bunları birleştirecek olan Regexp::Assemble olduğunu.

+0

Bu özellikle, model test edildiğinde birden çok değere aykırı olduğunda çok daha verimli olabilir. Bir regex eşleştirmesi başlatmak aslında oldukça pahalıdır. – ikegami

1

Orijinal kod aşağıdaki gibi daha güzel yazılmış olabilir:

$_ =~ /foo/ sadece /foo/ aynıdır çünkü
if( /.*\.so$/ 
    || /.*_mdb\.v$/ 
    || /.*daidir/ 
    || /\.__solver_cache__/ 
    || /csrc/ 
    || /csrc\.vmc/ 
    || /gensimv/ 
) { ... } 

. Eğer Perl 5.10 veya daha yüksek bir sürüme sahipseniz, Brad'in önerdiği gibi akıllı maç operatörünü kullanırdım.

İlgili konular