2011-03-29 22 views
6

मैं अपनी फाइलें खोलने के लिए इस वाक्यविन्यास का उपयोग करता हूं, क्योंकि मैंने सीखा है कि कुछ साल पहले एक प्रशिक्षण और किताबों में मैंने इसे वही किया है।इन "ओपन" प्रारूपों के बीच अंतर क्या हैं

open(INPUTFILE, "< $input_file") || die "Can't open $input_file: $!"; 

कुछ दिन पहले मैं एक इस फार्म तो जवाब में देखा था:

open($input_file, "<", $input_file) || die "Can't open $input_file: $!"; 

इस प्रारूप नया या सिर्फ एक ही है, एक अलग तरह से कर रही है, filehandle रूप में एक सामान्य चर का उपयोग कर है?

क्या मुझे "नया" प्रारूप में बदलना चाहिए? क्या इसमें कुछ फायदे हैं, या क्या "पुराने" प्रारूप में कुछ नुकसान हैं?

+3

[एसओ पर्ल एफएक्यू] से [http://stackoverflow.com/questions/tagged/perl?sort=faq): [पर्लिकल फाइलहेडल्स के साथ तीन-तर्क खुली कॉल क्यों एक पर्ल सर्वश्रेष्ठ अभ्यास है?] (Http: //stackoverflow.com/questions/1479741/why-is-three-argument-open-calls-with-lexical-filehandles-a-perl-best-practice) – daxim

उत्तर

11

आपको तीन-तर्क संस्करण का उपयोग करना चाहिए क्योंकि यह पागल नाम वाली फ़ाइलों के खिलाफ सुरक्षा करता है। निम्नलिखित पर विचार करें:

my $file = "<file.txt"; 
open(INPUTFILE, "< $file") or die "$!"; 

इस रूप को जोड़ देगा:

open(INPUTFILE, "< <file.txt") or die "$!"; 

... जिसका अर्थ है कि आप वास्तव में <file.txt नामित एक के बजाय file.txt नाम की एक फ़ाइल खोल देंगे।

open(my $fh, "<", $file.txt) or die "$!"; 

इस का कारण यह है कि जब $fh क्षेत्र से बाहर चला जाता है, फ़ाइल बंद कर देता है:

अब, filehandle के लिए, आप एक शाब्दिक filehandle उपयोग करना चाहते हैं। इसके अलावा, अन्य प्रकार के फाइलहेडल (मुझे याद नहीं है कि इसे क्या कहा जाता है) वैश्विक गुंजाइश है। प्रोग्रामर सभी कल्पनाशील नहीं हैं, इसलिए संभव है कि आप अपने फ़ाइल हैंडल INPUTFILE या FH या FILEHANDLE नाम दें। क्या होता है यदि किसी और ने ऐसा किया है, तो आपके द्वारा उपयोग किए जाने वाले मॉड्यूल में, उनके फाइलहेडल INPUTFILE नामित किया गया है? खैर, वे दोनों मान्य हैं और एक क्लॉबर्स दूसरे हैं। कौन सा क्लॉबर्स? कौन जाने। जब वे खोले जाते हैं तो यह आदेश देने पर निर्भर करता है। और बंद हो रहा है? और क्या होता है यदि अन्य प्रोग्रामर ने INPUTFILE खोला है लेकिन वास्तव में इसे लिखने के लिए खोला है? दुनिया खत्म, मेरे दोस्त, दुनिया खत्म हो गया।

आप एक शाब्दिक filehandle का उपयोग करते हैं ($fh) आप को समाप्त होने वाले दुनिया के बारे में चिंता है क्योंकि फोन यह $fh, चर गुंजाइश clobbering से बचाता है भले ही अन्य प्रोग्रामर करता नहीं है।

तो हां, हमेशा open() के तीन-तर्क फ़ॉर्म का उपयोग लेक्सिकल फ़ाइल हैंडल के साथ करें। दुनिया को बचाओ।

open(INFO, ">", $datafile) || die "Can't create $datafile: $!"; 

:

1

से the perl tutorial

भी एक 3 तर्क खुला है जो आप अपने स्वयं के बहस में विशेष पुनर्निर्देशन पात्रों डाल सकते हैं के संस्करण, नहीं है इस मामले में, फ़ाइल नाम को खोलने के लिए वास्तविक स्ट्रिंग $ dataFile है, इसलिए आपको $ डेटाफाइल के बारे में चिंता करने की ज़रूरत नहीं है जो फ़ाइल नाम की शुरुआत में ओपन मोड, या व्हाइटस्पेस को प्रभावित कर सकता है जो 2-तर्क संस्करण में अवशोषित हो जाएगा। इसके अलावा, अनावश्यक स्ट्रिंग इंटरपोलेशन की कमी एक अच्छी बात है।

तो open के 3 तर्क संस्करण का उपयोग करने के लिए सबसे सुरक्षित है।

3

खुले और तीन तर्क फ़ॉर्म के दो तर्क रूपों के बीच का अंतर यह है कि फ़ाइल नामों का विशेष वर्ण होने पर कैसा व्यवहार किया जाता है। उदाहरण के लिए, दो तर्कों में खुलने पर, यदि फ़ाइल नाम में | वर्ण, या कई अन्य विशेष वर्ण हैं, तो फ़ाइल खोल के साथ खोली जाएगी। इस प्रकार दो तर्क के साथ खोलने यह कुछ इस तरह लिखने के लिए संभव है:

open my $file, 'rm -rf * |'; 

और पर्ल खुशी से rm के उत्पादन के लिए एक पाइप खुल जाएगा, जबकि यह आपके सिस्टम को हटाने चलाता है।

जबकि यदि आप खुले तीन तर्क प्रपत्र का उपयोग करते हैं, तो फाइलनाम कभी भी खोल के माध्यम से पारित नहीं होता है, जो बहुत सुरक्षित है, अगर आपको अविश्वसनीय स्रोत से अपना फ़ाइल नाम मिल रहा है।

मुझे तीन तर्क फ़ॉर्म भी कम अस्पष्ट होने के लिए मिलते हैं क्योंकि यह आपको यह निर्दिष्ट करने के लिए मजबूर करता है कि क्या आप पढ़ रहे हैं, लिख रहे हैं या जोड़ रहे हैं।

आप manual page पर खुले के सभी गोर विवरण प्राप्त कर सकते हैं।

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