2010-08-18 10 views
14
$a = '/etc/init/tree/errrocodr/a.txt' 

मैं $file को $dir और a.txt को /etc/init/tree/errrocodr/ निकालना चाहते हैं। मैं उसे कैसे कर सकता हूँ?मैं निर्देशिका और फ़ाइल नाम में एक पूर्ण पथ कैसे अलग कर सकता हूं?

(संपादक की टिप्पणी: मूल प्रश्न माना है कि आप उस के लिए एक नियमित अभिव्यक्ति की जरूरत है।)

+0

क्या आपने पहले से ही इस सवाल को http://stackoverflow.com/questions/3511214/how-to-support-the-searching-file-based-on-regular-expression पर नहीं पूछा था? एक नया पोस्ट करने के बजाय, आपको इसे स्पष्ट करने के लिए अपना मूल प्रश्न संपादित करना चाहिए। – Ether

+0

@ ईथर, यह एक पूरी तरह से _different_ सवाल है, यह पूछना कि वाइल्डकार्ड के आधार पर फ़ाइलों की सूची कैसे प्राप्त करें। यह एक और है कि कैसे एक फाइलपीसी अपने भागों में विभाजित करने के लिए। – paxdiablo

उत्तर

24

बस Basename का उपयोग करें:

use File::Basename; 
$fullspec = "/etc/init/tree/errrocodr/a.txt"; 

my($file, $dir, $ext) = fileparse($fullspec); 
print "Directory: " . $dir . "\n"; 
print "File:  " . $file . "\n"; 
print "Suffix: " . $ext . "\n\n"; 

my($file, $dir, $ext) = fileparse($fullspec, qr/\.[^.]*/); 
print "Directory: " . $dir . "\n"; 
print "File:  " . $file . "\n"; 
print "Suffix: " . $ext . "\n"; 

आप इस आपके द्वारा अनुरोधित परिणाम लौटने देख सकते हैं, लेकिन यह है यह भी रूप में अच्छी तरह (ऊपर उत्तरार्द्ध खंड में) एक्सटेंशन कैप्चर करने की क्षमता:

Directory: /etc/init/tree/errrocodr/ 
File:  a.txt 
Suffix: 

Directory: /etc/init/tree/errrocodr/ 
File:  a 
Suffix: .txt 
+2

या वैकल्पिक रूप से, फ़ाइल :: स्पेक-> स्प्लिटपाथ() पर एक नज़र डालें, जो वॉल्यूम को भी अलग करता है (यदि आप ऐसे प्लेटफॉर्म पर होते हैं जिसमें ऐसी कोई चीज़ है)। या तो पैकेज का लाभ यह है कि वे मानक और पोर्टेबल हैं। –

16

आप इस के लिए एक regex की जरूरत नहीं है, आप dirname) का उपयोग कर सकते हैं (:

use File::Basename; 
my $dir = dirname($a) 

लेकिन इस regex काम करेगा:

my $dir = $a 
$dir =~ s/(.*)\/.*$/$1/ 
+0

+1, लेकिन आईपीएचओ को आपके उदाहरण में परिवर्तनीय '$ ए' का उपयोग नहीं करना चाहिए, भले ही ओपी ने गलती से किया हो। इसका उपयोग 'सॉर्ट' के लिए किया जाता है – dawg

0

उदाहरण के लिए:

$a =~ m#^(.*?)([^/]*)$#; 
    ($dir,$file) = ($1,$2); 

लेकिन, जैसा कि अन्य sa आईडी, इसके लिए Basename का उपयोग करना बेहतर है।

और, बीटीडब्ल्यू $a और $b से बेहतर नाम के रूप में बेहतर है, क्योंकि sort फ़ंक्शन के लिए उनके पास विशेष अर्थ है।

1

मुझे लगता है कि एक रेगेक्स समाधान पूरी तरह से वैध आवश्यकता है - क्योंकि मेरे गुगल ने मुझे यहां लाया है। मैं एक समूह है कि एक बड़ा मैच अभिव्यक्ति का हिस्सा है में एक फ़ाइल नाम बाहर निकलने के लिए चाहते हैं - यहाँ मेरी प्रयास है:

~> echo "https://stackoverflow.com/a/b/c/d" | perl -ne '/(?<dir>\/(\w+\/)*)(?<file>\w+)/ && print "dir $+{dir} file $+{file}\n";' 
dir /a/b/c/ file d 
0

इस कोशिश; यह कम से कम फ़ाइल नाम के लिए काम करता है, लेकिन जब आप इसे संशोधित करते हैं, तो यह आपको दिशा भी देता है: आप इसे यूनिक्स-सिस्टम पर \ n इसके बजाय/या दोनों के साथ उपयोग करने के लिए संशोधित भी कर सकते हैं।

$ filename = ~ s /(^.*/)// g;

किसी भी तरह बैकस्लैश 2 से पहले/प्रदर्शित नहीं किया जाता ...

1

उपयोग @array = split("/", $a); और फिर $array[-1] अपनी फ़ाइल नाम है।

संबंधित मुद्दे

 संबंधित मुद्दे