2017-12-14 81 views
5

मान लें कि आप केवल पर्ल 6 व्याकरण का उपयोग करके बड़ी फ़ाइल की शुरुआत को पार्स करना चाहते हैं। स्ट्रिंग में पूरी फ़ाइल को पढ़ने से बचने के लिए, और फिर स्ट्रिंग पर subparse पर कॉल करें। फ़ाइल पढ़ने के दौरान एक उपपर्यास करना संभव है?फ़ाइल पर व्याकरण उपपर्यास

मुझे Grammar कक्षा में subparsefile() विधि नहीं मिली, इसलिए मुझे लगता है कि इसे कार्यान्वित करना मुश्किल है। लेकिन सिद्धांत में यह संभव होना चाहिए, उदाहरण के लिए देखें How do I search a file for a multiline pattern without reading the whole file into memory?

+0

क्या मैच को फ़ाइल की शुरुआत में लंगर दिया जाना चाहिए? –

+1

@EugeneBarsky हां इसे शुरुआत में लंगर दिया जाना चाहिए, या वैकल्पिक रूप से, शुरुआत के इतने करीब लगाया जाना चाहिए कि यह पूरी फ़ाइल को स्मृति में पढ़ने के लिए भुगतान नहीं करेगा। –

+0

तो उस मामले में समाधान के 'रोटर' हिस्से की आवश्यकता नहीं है? –

उत्तर

7

वर्तमान में आप नहीं कर सकते हैं। इस समय किसी भी चीज़ को पार्स करने के लिए पूरी स्ट्रिंग को स्मृति में मौजूद होना आवश्यक है।

कहा करने के बाद अगर आप अपने पैटर्न से अधिक का विस्तार कर सकते हैं लाइनों की अधिकतम संख्या पता है, आप की तरह कुछ कर सकते हैं कि,:

my $max = 3; # maximum number of lines 
for "textfile".IO.lines(:!chomp).rotor($max => -$max + 1) -> @lines { 
    @lines.join.subparse($grammar) 
    # and whatever you would like to do 
} 

यह ऐसा करने का सबसे तेज़ तरीका नहीं होगा, लेकिन यह होगा स्मृति में पूरी फाइल को पढ़ने की ज़रूरत नहीं है।

+2

वैकल्पिक रूप से, यदि आप जानते हैं कि आपका पैटर्न अधिकतम कितना पात्र हो सकता है, तो आप "टेक्स्टफाइल" को आज़मा सकते हैं। आईओ.टी.बी. (आधामैक्ससाइज)। रोटर (2 => - 1) -> @chunks {@ chunks.join .subparse ($ व्याकरण)} ' –

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