2012-04-27 16 views
7

निर्देशिका सेटअप के बाद:रिश्तेदार निरपेक्ष पथ पर्ल

/dira/dirb 
/dira/dirb/myprog.pl 

/dira/dirb/testa/myfilesdir निम्न फ़ाइलें हैं

/dira/dirb/testa/myfilesdir/file1.txt 
/dira/dirb/testa/myfilesdir/file2.txt 

वर्तमान dir:

/dir/dirb 

./myprog.pl -p testa/myfilesdir 

फ़ाइलों के माध्यम से साइकिल

while (my $file_to_proc = readdir(DIR)) { 
... 

$file_to_proc = file1.txt 
$file_to_proc = file2.txt 

जो मैं चाहता

$myfile = /dira/dirb/testa/myfilesdir/file1.txt 
$myfile = /dira/dirb/testa/myfilesdir/file2.txt 

कुछ अलग पर्ल मॉड्यूल (CWD rel2abs) की कोशिश की, लेकिन यह वर्तमान निर्देशिका का उपयोग कर रहा है। मैं वर्तमान निर्देशिका का उपयोग नहीं कर सकता क्योंकि इनपुट सापेक्ष या पूर्ण पथ हो सकता है।

उत्तर

9

मॉड्यूल File::Spec का उपयोग करें। यहाँ एक उदाहरण:

use warnings; 
use strict; 
use File::Spec; 

for (@ARGV) { 
    chomp; 
    if (-f $_) { 
     printf qq[%s\n], File::Spec->rel2abs($_); 
    } 
} 

भागो इसे पसंद:

perl script.pl mydir/* 

और यह फ़ाइलों का पूर्ण पथ प्रिंट होगा।


एक अधिक कुशल कार्यक्रम के साथ अपडेट किया गया। टीएलपी के सुझावों के लिए धन्यवाद।

use warnings; 
use strict; 
use File::Spec; 

for (@ARGV) { 
    if (-f) { 
     print File::Spec->rel2abs($_), "\n"; 
    } 
} 
+1

'chomp' यहां अनावश्यक लगता है। अगर तर्क छोड़ा जाता है तो '-f'' _ _' का परीक्षण करेगा, जो '$ _' अनावश्यक बनाता है। मैं आगे तर्क दूंगा कि यह 'printf' का एक अनावश्यक उपयोग है। – TLP

+0

@ टीएलपी: धन्यवाद। मैंने आपके सुझावों के साथ उत्तर अपडेट किया है। अब बहुत बेहतर है लेकिन मैंने मूल प्रोग्राम – Birei

+0

छोड़ा है आपका स्वागत है। – TLP

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