2011-02-08 12 views
6

मैं फ़ाइल तर्क के रूप में प्राप्त खोलने की कोशिश कर रहा हूँ।पर्ल: खुलने फ़ाइल

जब मैं वैश्विक चर खुला में तर्क को सफलतापूर्वक काम करता हूं।

लेकिन

अगर मैं अपने खुले रूप में खुला फ़ाइल में विफल रहता है यह कर देना का उपयोग करें।

कारण क्या है।

#use strict; 
use warnings; 

#my $FILE=$ARGV[0]; #open Fails to open the file $FILE 

$FILE=$ARGV[0];  #Works Fine with Global $FILE 
open(FILE) 
    or 
die "\n ". "Cannot Open the file specified :ERROR: $!". "\n"; 
+6

perl की यह शैली ** रास्ता है ** अप्रचलित आप मेरी $ फ़ाइल खोलने से बहुत बेहतर होंगे, "<", $ ARGV [0] ... या बेहतर अभी तक खुला नहीं है और केवल एआरजीवी से पढ़ा है।(पर्ल मानते हैं कि इनपुट इनपुट के लिए फाइलें खोली जाएंगी, और उन्हें आपके लिए स्वचालित रूप से खुलती हैं।) –

+1

यूनरी ओपन केवल पैकेज चर पर काम करने के लिए प्रलेखित है। – tchrist

+0

@ विलियम: क्या वहां कोई एन्कोडिंग नहीं होगी? 'खुला (एफएच, "<: एन्कोडिंग (यूटीएफ -8)", $ पथनाम) ' – tchrist

उत्तर

13

एकल खुला काम करता है (वैश्विक) चर। यह the manpage पर प्रलेखित है।

पढ़ने के लिए एक फ़ाइल को खोलने का एक बेहतर तरीका होगा:

my $filename = $ARGV[0];   # store the 1st argument into the variable 
open my $fh, '<', $filename or die $!; # open the file using lexically scoped filehandle 

print <$fh>; # print file contents 

पी.एस. हमेशा strict और warnings का उपयोग करते समय अपने पर्ल स्क्रिप्ट डिबगिंग।

+2

यह उत्तर बिंदु को याद करता है। सरल सवाल यह था कि पैकेजरी चर के साथ केवल एक ही खुला काम क्यों करता है। सरल जवाब यह है कि ऐसा इसलिए है क्योंकि इस प्रकार इसे दस्तावेज किया जाता है। सब कुछ एक लापता केक पर ठंढ रहा है। – tchrist

+0

@trrist: ठीक है, मैंने इसे –

+0

उत्तर में जोड़ा। मैं आम तौर पर उन उत्तरों को कम नहीं करता जिसने इसे अच्छी कोशिश की है (यही कारण है कि मैंने यहां ऐसा नहीं किया)। मैं यह इंगित करना पसंद करता हूं कि वे क्या चूक गए। इसे ठीक करने के लिए धन्यवाद। – tchrist

7

यह perldoc -f open में सब है:

EXPR शामिल न करने पर, एक ही नाम के अदिश चर रूप filehandle फ़ाइल नाम शामिल हैं। (ध्यान दें कि शाब्दिक चर - उन के साथ घोषणा की, "मेरे" - इस उद्देश्य के लिए काम नहीं करेगा; इसलिए यदि आप उपयोग कर रहे हैं "मेरा", अपने कॉल खोलने के लिए में EXPR निर्दिष्ट करें।)

ध्यान दें कि फ़ाइल नाम निर्दिष्ट करने के लिए यह एक बहुत अच्छा तरीका नहीं है। जैसा कि आप देख सकते हैं, इसमें वैरिएबल प्रकार पर एक कठोर बाधा है, और या तो ग्लोबल वैरिएबल की आवश्यकता है या इसे खोलने वाले वैश्विक फाइलहेडल को आमतौर पर सबसे अच्छा टाला जाता है।

एक शाब्दिक filehandle का उपयोग करते हुए नियंत्रण में इसकी गुंजाइश रहती है, और स्वचालित रूप से बंद करने के हैंडल:

open my $fh, '<', "filename" or die "string involving $!"; 

और अगर आप कमांड लाइन से कि फ़ाइल का नाम ले रहे हैं, तो आप संभवतः कि open या किसी के साथ भाग कर सकता है पूरी तरह से संभाल लें, और कमांड लाइन तर्क या एसटीडीआईएन से पढ़ने के लिए सादे <> ऑपरेटर का उपयोग करें। (इस बारे में अधिक के लिए टिप्पणियों को देखने के) केवल पैकेज पर

+0

अच्छा बिंदु: यह आमतौर पर एक है एक स्पष्ट खुले से जादू एआरजीवी का उपयोग करने के लिए बहुत बेहतर है। लेकिन 'if (! @ARGV && -t STDIN) {चेतावनी दें "$ 0: stdin से पढ़ना ... \ n"}' उन लोगों की सहायता के लिए जिनके सिस्टम में उचित '^ T' tty char की कमी है। हालांकि, जादू एआरजीवी केवल स्टडीन का उपयोग करता है जब 'एआरजीवी' प्रारंभ में खाली होता है, जब यह समाप्त नहीं होता है; आपका उत्तर अन्यथा सुझाता है। – tchrist

+0

@ क्रिसमस: हाँ और नहीं ... '<> 'समाप्त हो गया एआरजीवी और एक बार फिर से अपरिचित लौटा (आप क्या कह रहे थे), यदि आप इसके बारे में कुछ नहीं किया है तो यह एक खाली @ARGV के साथ फिर से शुरू होगा, इसलिए एसटीडीआईएन (जो मैं कह रहा था) पर वापस आना। मैं स्वीकार करता हूं कि ज्यादातर लोग पहले अनिश्चितता को पहले से नहीं हटाएंगे और संपादित करेंगे। –

+0

उम, मैं ** ** ** जानता हूं कि कैसे <<> काम करता है। :) – tchrist

6
use strict; 
use warnings; 

my $file_name = shift @ARGV; 
open(my $file, '<', $file_name) or die $!; 
… 
close($file); 

हमेशा strict और warnings का उपयोग करें। अगर उनमें से कोई शिकायत करता है, तो कोड को ठीक करें, प्रागमाओं पर टिप्पणी न करें। तुम भी use autodie स्पष्ट or die से बचने के लिए कर सकते हैं खुल जाएं, autodie देखते हैं।

+1

+1 और इसे फिर से कहा जाना चाहिए: यदि 'सख्त' शिकायतें हैं, तो इसका मतलब है कि आपको अपना कोड ठीक करने की आवश्यकता है, न कि आपको 'सख्त' पर टिप्पणी करने की आवश्यकता है। –

+0

मैंने इसे पहले कहा है, मैं इसे फिर से कहूंगा: * यह उत्तर बिंदु को याद करता है। सरल सवाल यह था कि पैकेजरी चर के साथ केवल एक ही खुला काम क्यों करता है। सरल जवाब यह है कि ऐसा इसलिए है क्योंकि इस प्रकार इसे दस्तावेज किया जाता है। बाकी सब एक लापता केक पर ठंढ रहा है। * इसके अलावा, आप एन्कोडिंग को 'ओपन (एफएच, "<: एन्कोडिंग (यूटीएफ -8)", $ पथ) के रूप में निर्दिष्ट करना भूल गए हैं। और यदि कोई बहुत सावधान रह रहा है, तो क्या किसी को तर्कसंगतता के लिए 'एआरजीवी' का परीक्षण नहीं करना चाहिए? आखिरकार, आप कैसे जानते हैं कि वे ** नहीं ** मानक यूनिक्स फैशन में '-' जैसे फ़ाइल नामों को अनुमति देना चाहते हैं, जो std {in, out, whatever} निर्दिष्ट करने के लिए हैं? – tchrist

+1

इसके अलावा, यह वास्तव में एक बुरा मुहावरे है। पर्ल पहले से ही ARGV के माध्यम से तर्क के रूप में सूचीबद्ध फ़ाइलों को स्वचालित रूप से खोलता है। पर्ल में, फ़ाइल को स्पष्ट रूप से खोलने का लगभग कोई अच्छा कारण नहीं है जिसका नाम @ARGV –

3

Perl's docs for open()

से EXPR शामिल न करने पर, filehandle के रूप में एक ही नाम के अदिश चर फ़ाइल नाम शामिल हैं। (ध्यान दें कि शब्दावली चर - मेरे द्वारा घोषित किए गए - इस उद्देश्य के लिए काम नहीं करेंगे; इसलिए यदि आप मेरा उपयोग कर रहे हैं, तो खोलने के लिए अपने कॉल में EXPR निर्दिष्ट करें।)

+0

संक्षिप्त, सही, और बिंदु पर। – tchrist

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