खोज…


फाइल पढ़ना: जबकि बनाम बनाम

संभावित रूप से बड़ी फ़ाइल पढ़ते while , कुछ while लूप को foreach पर एक महत्वपूर्ण मेमोरी लाभ होता है। निम्नलिखित रिकॉर्ड द्वारा फ़ाइल रिकॉर्ड पढ़ेगा (डिफ़ॉल्ट रूप से, "रिकॉर्ड" का अर्थ है "एक पंक्ति", जैसा कि $/ द्वारा निर्दिष्ट किया गया है), प्रत्येक एक को $_ में असाइन करना जैसा कि यह पढ़ा जाता है:

while(<$fh>) {
    print;
}

हीरा ऑपरेटर यह सुनिश्चित करने के लिए यहां कुछ जादू करता है कि लूप केवल एंड-ऑफ-फाइल पर समाप्त होता है और उदाहरण के लिए, केवल "0" वर्ण वाली लाइनों पर नहीं।

निम्नलिखित लूप सिर्फ एक ही काम करता है, हालांकि यह सूची के संदर्भ में हीरा ऑपरेटर का मूल्यांकन करता है, जिससे पूरी फाइल एक में पढ़ी जाती है:

foreach(<$fh>) {
    print;
}

यदि आप किसी भी समय एक रिकॉर्ड पर काम कर रहे हैं, तो इसके परिणामस्वरूप मेमोरी की भारी बर्बादी हो सकती है और इस तरह से बचा जाना चाहिए।

लंबी सूची संसाधित करना

यदि आपके पास पहले से ही मेमोरी में एक सूची है, तो सीधा और आमतौर पर इसे संसाधित करने का पर्याप्त तरीका एक सरल foreach लूप है:

foreach my $item (@items) {
    ...
}

यह $item पर कुछ प्रसंस्करण करने के सामान्य मामले के लिए उदाहरण के लिए ठीक है और फिर इसे डेटा के आसपास रखने के बिना किसी फ़ाइल में लिख दिया जाता है। हालाँकि, यदि आप आइटम से कुछ अन्य डेटा संरचना बनाते हैं, तो while लूप अधिक मेमोरी कुशल होता है:

my @result;
while(@items) {
    my $item = shift @items;
    push @result, process_item($item);
}

जब तक $item एक संदर्भ सीधे आपकी परिणाम सूची में समाप्त नहीं हो जाता, तब तक आप @items सरणी से @items गई @items को मुक्त किया जा सकता है और अगले लूप पुनरावृत्ति दर्ज करते समय इंटरप्रेटर द्वारा पुन: उपयोग की जाने वाली मेमोरी।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow