2010-10-18 24 views
13

मैं पर्ल में कुछ इस तरह कर सकता हूँ? फ़ाइल पैटर्न पर अर्थ पैटर्न मिलान करें और जांचें कि यह मौजूद है या नहीं।मैं कैसे परीक्षण कर सकते हैं अगर एक पैटर्न मिलान एक फ़ाइल नाम पर्ल में मौजूद है?

if(-e "*.file") 
    { 
     #Do something 
    } 

मैं फ़ाइलों को वर्तमान सूची प्रणाली पूछने का अब समाधान पता; इसे एक फ़ाइल के रूप में पढ़ें और फिर अनुमान लगाएं कि फ़ाइल मौजूद है या नहीं।

उत्तर

29

आप glob का उपयोग पैटर्न से मेल खाते सभी फ़ाइलों की एक सरणी वापस जाने के लिए कर सकते हैं:

@files = glob("*.file"); 

foreach (@files) { 
    # do something 
} 

आप बस जानना आवश्यक है कि पैटर्न मिलान एक फ़ाइल मौजूद चाहते हैं, आप काम को छोड़ कर सकते हैं:

if (glob("*.file")) { 
    # At least one file matches "*.file" 
} 
+6

बस पूरा होने के लिए, आप 'foreach (glob ("*। File")) {something}' भी कर सकते हैं ... – dawg

+0

लेकिन मैं वहां regexp डालने में असमर्थ हूं। क्या मैं नियमित अभिव्यक्तियों का उपयोग कर सकता हूं? – Jean

+0

नहीं @alertjean, आप निर्देशिका और मैन्युअल रूप से स्कैन फ़ाइल नाम रेगुलर एक्सप्रेशन के उपयोग को खोलने के लिए होगा। 'ग्लोब' केवल पारंपरिक [शैल वाइल्ड कार्ड्स] का समर्थन करता है (http://www.tuxfiles.org/linuxhelp/wildcards.html)। – meagar

0

* nix सिस्टम पर, मैं अच्छे परिणाम के साथ निम्न का उपयोग किया है।

sub filesExist { return scalar (my @x = `ls -1a 2> /dev/null "$_[0]"`) } 

यह पाया मैचों की संख्या के साथ 0 यदि कोई भी जवाब है, या। इसे 'अगर' सशर्त में आसानी से उपयोग किया जाता है जैसे:

if(!filesExist("/foo/var/not*there.log") && 
    !filesExist("/foo/var/*/*.log") && 
    !filesExist("/foo/?ar/notthereeither.log")) 
{ 
    print "No matches!\n"; 
} else { 
    print "Matches found!\n"; 
} 

वास्तव में आप कौन से पैटर्न का उपयोग कर सकते हैं, यह निर्धारित करेगा कि आपका खोल किस प्रकार समर्थन करता है। लेकिन अधिकांश गोले '*' और '?' के उपयोग का समर्थन करते हैं - और वे हर जगह एक ही चीज़ का मतलब है मैंने देखा है। बेशक, अगर आपने 'स्केलर' फ़ंक्शन पर कॉल हटा दिया है, तो यह उन मैचों को वापस कर देगा - वे चर फ़ाइल फ़ाइल नामों के लिए उपयोगी।