मैं आमतौर पर निम्नलिखित कोड का उपयोग कर एक फ़ाइल की पंक्तियों के माध्यम से लूप:पर्ल के साथ फाइल में लाइनों के माध्यम से लूप करने का सबसे रक्षात्मक तरीका क्या है?
open my $fh, '<', $file or die "Could not open file $file for reading: $!\n";
while (my $line = <$fh>) {
...
}
हालांकि, in answering another question, Evan Carroll मेरा उत्तर संपादित, करने के लिए अपने while
बयान बदल रहा है:
while (defined(my $line = <$fh>)) {
...
}
उनका तर्क था कि यदि आप एक लाइन है जो 0
है (इसे अंतिम पंक्ति होना चाहिए, अन्यथा इसमें कैरिज रिटर्न होगा) तो आपके while
यदि आप मेरे कथन का उपयोग करते हैं तो समय से बाहर निकल जाएगा ($line
पर सेट किया जाएगा, और असाइनमेंट से वापसी मूल्य भी "0"
होगा जो गलत पर मूल्यांकन किया जाता है)। यदि आप परिभाषित-नस्ल की जांच करते हैं, तो आप इस समस्या में भाग नहीं लेते हैं। यह सही समझ में आता है।
तो मैंने कोशिश की। मैंने एक टेक्स्टफाइल बनाया जिसकी आखिरी पंक्ति 0
है जिसमें कोई कैरिज रिटर्न नहीं है। मैंने इसे अपने लूप के माध्यम से चलाया और लूप समय से बाहर नहीं निकल गया।
मैंने सोचा, "आह, शायद मूल्य वास्तव में 0
नहीं है, हो सकता है कि वहां कुछ और चीजें हैं जो चीजों को खराब कर रही हैं!" इसलिए मैं Devel::Peek
से Dump()
का इस्तेमाल किया और यह है कि क्या यह मुझे दिया है:
SV = PV(0x635088) at 0x92f0e8
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0X962600 "0"\0
CUR = 1
LEN = 80
, मुझे बताने की कि मूल्य वास्तव में स्ट्रिंग "0"
है के रूप में मैं एक ऐसी ही परिणाम प्राप्त अगर मैं एक अदिश मैं पर Dump()
फोन लगता है कि स्पष्ट रूप से "0"
पर सेट किया गया है (केवल अंतर LEN फ़ील्ड में है - फ़ाइल से LEN 80 है, जबकि स्केलर LEN से 8 है)।
तो सौदा क्या है? मेरे while()
लूप से बाहर निकलने का समय क्यों नहीं है यदि मैं इसे एक लाइन पास करता हूं जो केवल "0"
कैरिज रिटर्न के साथ है? क्या इवान का लूप वास्तव में अधिक रक्षात्मक है, या पर्ल आंतरिक रूप से कुछ पागल करता है जिसका मतलब है कि आपको इन चीजों के बारे में चिंता करने की आवश्यकता नहीं है और while()
वास्तव में केवल eof
पर क्लिक करते समय बाहर निकलता है?
यदि आप रक्षात्मक कोड लिखना चाहते हैं, तो [टैंक] का उपयोग करें (http://en.wikipedia.org/wiki/Tank)। –
यही कारण है कि मैं किसी की प्रतिक्रिया का अर्थ संपादित नहीं करूंगा (मैं केवल स्पष्ट टाइपो को ठीक करता हूं)। अगर आपको लगता है कि कुछ गुम है या इसमें सुधार किया जा सकता है तो इसके बजाय एक टिप्पणी जोड़ें। और आंतरिक जांच के लिए आप के लिए kudos! – Ether