2014-06-10 7 views
6

तो, मैंने <FILE> का उपयोग बड़ी संख्या में किया है। एक साधारण उदाहरण होगा:तो <FILE> वास्तव में क्या करता है?

open (FILE, '<', "someFile.txt"); 
while (my $line = <FILE>){ 
print $line; 
} 

तो, मैंने सोचा था कि <FILE> का उपयोग कर एक फ़ाइल के आ हिस्सा एक समय में (एक लाइन विशेष रूप से) लेगी और उसका उपयोग होता है, और जब यह फिर से बुलाया गया था, यह होगा अगली पंक्ति पर जाओ। और वास्तव में, जब भी मैं <FILE> को स्केलर पर सेट करता हूं, वही है जो यह करेगा। लेकिन, जब मैंने कंप्यूटर को इस तरह की एक पंक्ति बताया:

print <FILE>; 

यह पूरी फ़ाइल, न्यूलाइन और सभी को मुद्रित करता है। तो मेरा सवाल यह है कि कंप्यूटर <FILE> पारित होने पर क्या सोचता है, बिल्कुल?

उत्तर

12

डायमंड ऑपरेटर <> फ़ाइल से पढ़ने के लिए उपयोग किया जाता है वास्तव में readline फ़ंक्शन में बनाया गया है।

perldoc -f readline

से filehandle जिसका typeglob EXPR में निहित है (या से * ARGV अगर EXPR प्रदान नहीं की है) से पढ़ता है। स्केलर संदर्भ में, प्रत्येक कॉल तब तक पढ़ती है और अगली पंक्ति को तब तक लौटाती है जब तक कि अंत-फ़ाइल तक नहीं पहुंच जाती है, जहां बाद में कॉल वापस आती है। सूची संदर्भ में, पढ़ता है जब तक कि अंत तक फ़ाइल तक नहीं पहुंच जाती है और लाइनों की एक सूची लौटाती है।

आप पर्ल में विशेष संदर्भ जाँच करना चाहते हैं,

sub context { return wantarray ? "LIST" : "SCALAR" } 

print my $line = context(), "\n"; 
print my @array = context(), "\n"; 
print context(), "\n"; 

उत्पादन

SCALAR 
LIST 
LIST 
7

यह निर्भर करता है कि इसका उपयोग स्केलर संदर्भ या सूची संदर्भ में किया जाता है।

स्केलर संदर्भ में: my $line = <file> यह एक टाई पर एक पंक्ति पढ़ता है।
सूची संदर्भ में: my @lines = <FILE> यह पूरी फ़ाइल को पढ़ता है।

जब आप print <FILE>; कहते हैं तो यह सूची संदर्भ है।

2

व्यवहार किस संदर्भ में यह मूल्यांकन किया जा रहा है पर निर्भर करता है अलग है:

my $scalar = <FILE>; # Read one line from FILE into $scalar 
my @array = <FILE>; # Read all lines from FILE into @array 

print एक लेता है सूची तर्क, <FILE> का मूल्यांकन सूची संदर्भ में किया जाता है और बाद में व्यवहार करता है।

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