2011-03-02 22 views
5

में एकाधिक पैटर्न मिलान के लिए कैसे जांचें, क्या कोई तरीका है कि मैं इसे एकाधिक पैटर्न चेक के लिए उपयोग करने से बच सकता हूं?पर्ल

क्या मैं एक सरणी में सभी पैटर्न तोड़ सकता हूं और जांच सकता हूं कि यह पैटर्न सरणी में किसी भी पैटर्न से मेल खाता है या नहीं? कृपया उस मामले पर विचार करें जब मेरे पास 20 से अधिक पैटर्न स्ट्रिंग हों।

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

@Eric okay .. मुझे खेद है कि – Arovit

उत्तर

11

यदि आप पर्ल संस्करण 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){ 
    ... 
} 

यदि आप पर्ल 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

ऐसा करने के लिए खेद है कि स्मार्टमैच अब प्रयोगात्मक के रूप में फ़्लैग किया गया है, और इसे बिना किसी सूचना के हटा दिया जाएगा या बदला जाएगा। (इस तरह लगता है 5.26 में होगा।) बाद का समाधान पर्ल के आपके संस्करण के बावजूद इस्तेमाल किया जाना चाहिए। – ikegami

4

एक अन्य पूर्व Perl 5.10 विकल्प Regexp::Assemble, जो प्रतिमानों की सूची लेने के लिए और उन्हें एक ही regex कि एक ही बार में मूल शर्तों के सभी परीक्षण में गठबंधन होगा।

+0

यह अधिक कुशल हो सकता है, खासकर यदि पैटर्न का परीक्षण किया गया है तो कई मानों के खिलाफ है। रेगेक्स मैच शुरू करना वास्तव में काफी महंगा है। – ikegami

1

आपका मूल कोड अधिक अच्छी तरह से इस तरह लिखा गया हो सकता:

if( /.*\.so$/ 
    || /.*_mdb\.v$/ 
    || /.*daidir/ 
    || /\.__solver_cache__/ 
    || /csrc/ 
    || /csrc\.vmc/ 
    || /gensimv/ 
) { ... } 

है ऐसा इसलिए है क्योंकि $_ =~ /foo/ सिर्फ /foo/ के समान है। यदि आपके पास पर्ल 5.10 या इससे अधिक है, तो ब्रैड सुझाव दिया जाएगा और स्मार्ट मैच ऑपरेटर का उपयोग करेगा।