2010-05-23 24 views
7

निम्नलिखित कोड एक तरह से ठीक काम कर रहा है:मैं पर्ल पाइप से आउटपुट कैसे प्राप्त कर सकता हूं क्योंकि यह उपलब्ध हो जाता है?

open(PIPE, '-|', 'ant'); 
for(<PIPE>) { 
    print; 
} 

हालांकि, यह जो मैं चाहता भी नहीं करता है। चूंकि चींटी निर्माण में 5 मिनट लग सकते हैं, इसलिए मैं लाइन से आउटपुट लाइन देखना चाहता हूं। इसके बजाय, मुझे प्रक्रिया के अंत में पूरा इनपुट मिल रहा है।

पर्ल डीबगर के साथ यह को देखते हुए, पर्ल, बयान 'के लिए' पर इंतजार कर रहा है चींटी समाप्त जब तक। ऐसा क्यों है?

उत्तर

8

बस संपूर्णता के लिए (समस्या के रूप में उरी के जवाब देने के लिए टिप्पणी में बताया हल किया गया था) समस्या पैदा हुई क्योंकि for अभिव्यक्ति निम्नलिखित के लिए, सूची संदर्भ में <> ऑपरेटर (see) का मूल्यांकन करता है समतुल्य रूप:

foreach $line (@lines = <PIPE>) { 
    print $line; 
} 

सूची संदर्भ में, <> ऑपरेटर सूची asign करने के लिए अपने इनपुट से सभी लाइनों को पढ़ने के लिए कोशिश करता है - और इनपुट जब तक प्रक्रिया समाप्त हो जाती है, यह अवरुद्ध कर देगा एक प्रक्रिया से आता है। केवल बाद में यह लूप बॉडी में प्रवेश करेगा।

विकल्प वाक्य रचना

while(<PIPE>) {   
    print; 
} 

बजाय

while( $line = <PIPE>) { 
    print $line; 
} 

यानी के बराबर है, यह प्रत्येक लूप चरण में इनपुट से प्रत्येक पंक्ति की खपत, और यह एक इस परिदृश्य में क्या करना चाहता है है ।

3

मुझे विश्वास है कि समस्या बफरिंग है। आप filehandle गर्म (unbuffered) इसलिए की तरह कर सकता है:

select PIPE; 
$| = 1; # the pipe is just a coincidence. that's the variable's name 
select STDOUT; # select it back 

यह पाइप के लिए बफरिंग अक्षम करना चाहिए। मैंने सीखना पर्ल, 5TH में इस तरह कुछ के बारे में पढ़ा। this भी देखें। आपको शायद यह भी सुनिश्चित करना चाहिए कि बफरिंग कहीं और नहीं होती है।

संपादित करें: ओपी पोस्ट किया है कि जबकि साथ के लिए की जगह समस्या

मुझे लगता है कि अब मैं समझ को हल किया। while जबकि foreach और पहले तरह for कार्य करता है, पाश चलाता है प्रत्येक पंक्ति हो जाता है और सभी लाइनों और लाइनों पर तो छोरों (यह सूची संदर्भ की जरूरत है) हो जाता है।

+7

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

2

इसे मिला। समस्या 'के लिए' कथन के साथ है।

निम्नलिखित कोड अपेक्षित ढंग से

open(PIPE, '-|', 'ant'); 
while(<PIPE>) {   # replacing 'for' with 'while' 
    print; 
} 

मैं कारण पता नहीं है काम करता है, लेकिन अब यह काम कर रहा है।

+2

क्यों समझें, http://stackoverflow.com/questions/585341/ – Joe

+0

देखें यदि आपने अपने प्रश्न का उत्तर दिया है, तो मूल प्रश्न संपादित करना और उत्तर पोस्ट करने के बजाय उत्तर जोड़ने का अच्छा विचार है। –

+2

@ बैरी ब्राउन अपना स्वयं का उत्तर पोस्ट कर रहा है और अगर कोई बेहतर उत्तर प्रदान नहीं करता है तो उसे स्वीकार कर लिया जाता है (हे) अभ्यास एसओ पर। http://meta.stackexchange.com/questions/12513/stackoverflow-should-i-answer-my-own-question-or-not – hobbs

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