2013-09-25 8 views
7

मैं एक फ़ोल्डर के साथ फ़ाइल नाम को नहीं पहचानता है, उसका नाम है:ग्लोब वर्ग कोष्ठक

drwxr-xr-x. 2 user user  4096 Aug 2 18:30 folder name [www.website.com] 

लेकिन जब मैं इस तरह ग्लोब का उपयोग करें:

my @files = glob ("/home/user/Downloads/folder name [www.website.com]/*"); 
print "@files/n"; 

उस में फ़ाइलों की सूची नहीं है

/home/user/Downloads/folder name 

मैं व्हाइटस्पेस और इस तरह वर्ग कोष्ठक भागने की कोशिश की है: निर्देशिका, परिणाम इस प्रकार है

/home/user/Downloads/folder\ name\ \[www.website.com\] 

लेकिन परिणाम वही है, मेरी गलती क्या हो सकती है या मेरे कोड को बेहतर बनाने के लिए क्या कर सकता है?

अग्रिम धन्यवाद

+0

आपकी समस्या से संबंधित नहीं है, लेकिन मुझे लगता है कि आप चाहते हैं '\ n' में:' प्रिंट "@files \ n"; ' – toolic

+1

हाँ, यह मेरी गलती है धन्यवाद – Davico

उत्तर

9

में निर्मित glob समारोह खाली स्थान के पर पैटर्न बांट देता है। तो आप

my @files = (
    glob("/home/user/Downloads/folder"), 
    glob("name"), 
    glob("[www.website.com]/*"), 
); 

व्हाइटस्पेस और ब्रैकेट से बचने के लिए कुछ विकल्प कर रहे हैं। लेकिन यह बेहतर नियंत्रण के लिए कोर File::Glob module उपयोग करने के लिए बेहतर है:

use File::Glob ':bsd_glob'; 

my @files = bsd_glob("/home/user/Downloads/folder name \\[www.website.com\\]/*"); 

अब, केवल कोष्ठक भाग निकले जाने की जरूरत है। यह बिल्टिन ग्लोब को भी ओवरराइड करता है, इसलिए आपको उस आयात को छोड़कर वास्तव में अपना कोड बदलना नहीं है (और निश्चित रूप से, पैटर्न)।

+0

पर्ल संस्करण 5.14 पर, मुझे 'फ़ाइल :: ग्लोब' का उपयोग करने की आवश्यकता है: glob '; '। ऐसा लगता है कि '6: bsd_glob' 5.16 में जोड़ा गया था। – toolic

+1

@toolic दस्तावेज़ों से: * 'ग्लोब' टैग, अब निराश, ': bsd_glob' का पुराना संस्करण है। यह एक ही स्थिरांक और कार्यों को निर्यात करता है, लेकिन इसका 'ग्लोब() 'ओवरराइड पुनरावृत्ति का समर्थन नहीं करता है * यानी अनंत लूप का कारण बन सकता है। ऐसा लगता है कि 'bsd_glob' perl 5.016 में जोड़ा गया था। यदि बैक-कॉम्पैक्ट निरंतर है, तो 'ग्लोब' का उचित उपयोग करना सही काम लगता है। – amon

+0

भागने से काम करता है। अंतरिक्ष से बचना आसान होगा। – ikegami

1

स्पेस और स्क्वायर ब्रैकर ग्लोब पैटर्न में विशेष हैं। मैच के लिए

/home/user/Downloads/folder name [www.website.com] 

आप

/home/user/Downloads/folder\ name\ \[www.website.com\] 

जरूरत है तो पूरा पैटर्न

/home/user/Downloads/folder\ name\ \[www.website.com\]/* 

कि स्ट्रिंग बनाने के लिए आपको स्ट्रिंग शाब्दिक

"/home/user/Downloads/folder\\ name\\ \\[www.website.com\\]/*" 

टेस्ट इस्तेमाल कर सकते हैं है:

$ perl -E'say for glob "/home/eric/Downloads/folder\\ name\\ \\[www.website.com\\]/*"' 
/home/eric/Downloads/folder name [www.website.com]/foo 

ध्यान दें कि रिक्त स्थान विंडोज़ में नहीं बच सकते हैं। आपको फ़ाइल :: ग्लोब के bsd_glob का उपयोग करना होगा। (यह glob रूप में एक ही समारोह कहता है, लेकिन अलग अलग झंडे के साथ है।)

use File::Glob qw(bsd_glob); 
say for bsd_glob("C:\\Program Files\\*"); 
संबंधित मुद्दे