पहिया को फिर से क्यों शुरू करें?
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
में प्रतिस्थापन है।
यह गलत है:
लेकिन फिर वहाँ इस समाधान के साथ कई समस्याएं हैं। यूनिक्स आधारित सिस्टम में एक फ़ाइल नाम (विंडोज़ के बारे में निश्चित नहीं) में नई लाइन हो सकती है। लेकिन डिफ़ॉल्ट रूप से .
एक नई लाइन से मेल नहीं खाता है।
($file = $path) =~s/.*\///s;
सबसे महत्वपूर्ण बात यह पोर्टेबल नहीं है, यह /
संभालने के रूप में पथ विभाजक जो की तरह कुछ प्लेटफॉर्म के साथ ऐसा नहीं है: तो तुम एक s
संशोधक का उपयोग करने के लिए इतना है कि .
न्यू लाइन से मेल खाता है और साथ ही होगा विंडोज (जो \
का उपयोग करता है), मैक (जो :
का उपयोग करता है)। तो मॉड्यूल का उपयोग करें और इसे आपके लिए इन सभी मुद्दों को संभालने दें।
सहमत का नाम होगा। एक रेगेक्स की तुलना में इस तरह के मॉड्यूल का उपयोग करके आम तौर पर बेहतर है क्योंकि यह क्रॉस प्लेटफ़ॉर्म है। – justintime
यह भी ध्यान दें कि फ़ाइल :: बेसनाम एक मूल मॉड्यूल है, और हमेशा पर्ल 5 में रहा है इसलिए इसे स्थापित करने की आवश्यकता नहीं है। – mscha
फ़ाइल :: बेसनाम के बारे में मैन पेज, इस कार्य के लिए 'fileparse' विधि का उपयोग करने की सिफारिश करता है, क्योंकि "[बेसनाम] हमेशा पथ के फ़ाइल नाम भाग को वापस नहीं करता है जैसा कि आप उम्मीद कर सकते हैं" – jutky