तरह ह्यूगो ने कहा, वहाँ कोई समस्या नहीं है, तो आप अपने माता पिता प्रक्रिया के CWD को प्रभावित नहीं कर सकते हैं।
कहाँ सवाल लागू है आप पूरी प्रक्रिया को नियंत्रित नहीं करते हैं, एक सबरूटीन या मॉड्यूल में की तरह है। उन मामलों में आप उसी निर्देशिका में subroutine से बाहर निकलना चाहते हैं जैसे आपने दर्ज किया है, अन्यथा क्रिया-पर-दूरी दूरी को सूक्ष्मताएं जिसमें बग का कारण बनता है।
हाथ से
यह करने के लिए आप कर सकते हैं ...
use Cwd;
sub foo {
my $orig_cwd = cwd;
chdir "some/dir";
...do some work...
chdir $orig_cwd;
}
लेकिन यह है कि समस्या है। अगर सबराउटिन जल्दी लौटाता है या मर जाता है (और अपवाद फंस जाता है) तो आपका कोड अभी भी some/dir
में होगा। इसके अलावा, chdir
एस विफल हो सकता है और आपको प्रत्येक उपयोग की जांच करना याद रखना होगा। Bleh।
सौभाग्य से, इस आसान बनाने के लिए एक जोड़े मॉड्यूल है। फ़ाइल :: pushd एक है, लेकिन मैं File::chdir पसंद करता हूं।
use File::chdir;
sub foo {
local $CWD = 'some/dir';
...do some work...
}
फ़ाइल :: chdir $CWD
को बताए में निर्देशिका बदलते बनाता है। और आप $CWD
को स्थानीयकृत कर सकते हैं, इसलिए यह आपके दायरे के अंत में रीसेट हो जाएगा, इससे कोई फर्क नहीं पड़ता। यह स्वचालित रूप से जांचता है कि chdir
सफल होता है और अन्यथा अपवाद फेंकता है। कभी-कभी यह स्क्रिप्ट में इसका उपयोग करता है क्योंकि यह इतना सुविधाजनक है।
मुझे प्रश्न नहीं मिला। कोई भी कैसे बता सकता है कि आपकी स्क्रिप्ट ने एक नई निर्देशिका में सीडी किया है? –
वर्तमान उत्तर इस "यह वैध वाक्यविन्यास से संपर्क करते हैं और वह माता-पिता के खोल को प्रभावित नहीं करते हैं, इसलिए यह ठीक है" परिप्रेक्ष्य। मैं इस प्रश्न के लिए एक और हिस्सा देखता हूं, जैसे "स्क्रिप्ट्स में cd'ing है बदसूरत कोडिंग शैली, पाइथन या खराब चुने हुए चर नामों की लंबी लाइनों के समान - कुछ ऐसा किया जा सकता है लेकिन इससे बचने का सबसे अच्छा अभ्यास है"। – dfarrell07