2011-01-22 12 views
11

मेरे पास एक पर्ल वैरिएबल है जो मैं डेटाबेस से पॉप्युलेट करता हूं। इसका नाम $path है। मुझे एक और चर $file प्राप्त करने की आवश्यकता है, जिसमें पथनाम से केवल फ़ाइल नाम है।मैं पर्ल का उपयोग कर पथ से फ़ाइल नाम कैसे निकाल सकता हूं?

मैंने कोशिश की:

$file = $path =~ s/.*\///; 

मैं बहुत पर्ल के लिए नया हूँ।

उत्तर

24

पहिया को फिर से क्यों शुरू करें?

use File::Basename; 
... 
$file = basename($path); 

काम क्यों नहीं $file=$path=~s/.*\///; था: File::Basename मॉड्यूल का उपयोग करें?

$file = ($path =~s/.*\///); 

जो $path में प्रतिस्थापन करता है और प्रदान करती है या तो 1 (प्रतिस्थापन होता है) या '':

=~ उच्च precedence से =

तो

$file = $path =~s/.*\///; 

के रूप में व्यवहार किया जाता है है (यदि कोई प्रतिस्थापन नहीं होता है)।

क्या आप चाहते हैं:

($file = $path) =~s/.*\///; 

जो $file करने के लिए $path का मूल्य प्रदान करती है और उसके बाद $path में प्रतिस्थापन है।

  1. यह गलत है:

    लेकिन फिर वहाँ इस समाधान के साथ कई समस्याएं हैं। यूनिक्स आधारित सिस्टम में एक फ़ाइल नाम (विंडोज़ के बारे में निश्चित नहीं) में नई लाइन हो सकती है। लेकिन डिफ़ॉल्ट रूप से . एक नई लाइन से मेल नहीं खाता है।

    ($file = $path) =~s/.*\///s; 
    
  2. सबसे महत्वपूर्ण बात यह पोर्टेबल नहीं है, यह / संभालने के रूप में पथ विभाजक जो की तरह कुछ प्लेटफॉर्म के साथ ऐसा नहीं है: तो तुम एक s संशोधक का उपयोग करने के लिए इतना है कि . न्यू लाइन से मेल खाता है और साथ ही होगा विंडोज (जो \ का उपयोग करता है), मैक (जो : का उपयोग करता है)। तो मॉड्यूल का उपयोग करें और इसे आपके लिए इन सभी मुद्दों को संभालने दें।

+1

सहमत का नाम होगा। एक रेगेक्स की तुलना में इस तरह के मॉड्यूल का उपयोग करके आम तौर पर बेहतर है क्योंकि यह क्रॉस प्लेटफ़ॉर्म है। – justintime

+1

यह भी ध्यान दें कि फ़ाइल :: बेसनाम एक मूल मॉड्यूल है, और हमेशा पर्ल 5 में रहा है इसलिए इसे स्थापित करने की आवश्यकता नहीं है। – mscha

+0

फ़ाइल :: बेसनाम के बारे में मैन पेज, इस कार्य के लिए 'fileparse' विधि का उपयोग करने की सिफारिश करता है, क्योंकि "[बेसनाम] हमेशा पथ के फ़ाइल नाम भाग को वापस नहीं करता है जैसा कि आप उम्मीद कर सकते हैं" – jutky

0

Path::Class पर overkill की तरह लग सकता पहले लेने-पथ लेकिन फ़ाइल की वस्तुओं और dir यह वास्तव में जटिल लिपियों में भुगतान कर सकते हैं और बहुत सारे बोनस प्रदान करते हैं जो स्पेगेटी को रोक देंगे जब आप स्कोप क्रीप द्वारा कोने में बैक लेंगे। पथ को हल करने के लिए मज़े के पहले उदाहरण में File::Spec का उपयोग किया जाता है।

use warnings; 
use strict; 
use Path::Class qw(file); 
use File::Spec; 

# Get the name of the current script with the procedural interface- 
my $self_file = file(File::Spec->rel2abs(__FILE__)); 
print 
    " Full path: $self_file", $/, 
    "Parent dir: ", $self_file->parent, $/, 
    " Just name: ", $self_file->basename, $/; 

# OO          
my $other = Path::Class::File->new("/tmp/some.weird/path-.unk#"); 
print "Other file: ", $other->basename, $/; 
0
$url=~/\/([^\/]+)$/; 
print "Filename $1\n"; 
+2

बेहतर पोस्ट करने के लिए, आप अपने उत्तर पर विस्तार कर सकते हैं, यह बताते हुए कि क्यों विशेष रेगेक्स विभिन्न उदाहरणों के लिए काम करेगा। यह आपके उत्तर को मूल पोस्टर, _and_ को कई अन्य भावी पाठकों को समझने में मदद करेगा। – Castaglia

1

मुझे लगता है कि ऐसा करने का सबसे अच्छा तरीका है -

use File::Basename; 

my $file_name = basename($0); 

तो चर $file_name अपनी स्क्रिप्ट

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

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