2010-03-12 8 views
14

मेरे पास perl में एक कम्प्यूटेशनल रूप से महंगा कार्य है, और उपयोगकर्ता को यह सूचित करना चाहता हूं कि गणना के प्रत्येक भाग के बाद एक अवधि छापकर गणना जारी है। दुर्भाग्यवश, जब तक मैं एक "\ n" प्रिंट नहीं करता, मेरी कोई भी अवधि मुद्रित नहीं होती है। मैं इसे कैसे संबोधित कर सकता हूं?पर्ल में एक नई लाइन के इंतजार किए बिना मैं तुरंत टेक्स्ट कैसे प्रिंट कर सकता हूं?

उत्तर

17

आपको STDOUT के लिए ऑटोफ्लश सेट करने की आवश्यकता है। उदाहरण:

use IO::Handle; 
STDOUT->autoflush(1); 
foreach (1..20) { 
    print '.'; 
    sleep(1); 
} 
+2

@ हंस कृपया पुस्तकों की अनधिकृत प्रतियों से लिंक न करें। –

+0

http://oreilly.com/catalog/9780596003135 और http://oreilly.com/catalog/9780596003135 देखें। –

+0

क्षमा करें, यह अभी पॉप अप हो गया है मैंने वेब की खोज की। अब लिंक हटा दिया। –

7

प्रिंटिंग शुरू करने से पहले $|=1 सेट करें। उदाहरण के लिए।

perl -e ' $|=1; foreach (1..10) { print "$_ "; sleep(1); }' 
+1

+1, क्योंकि किसी ने एक समाधान समाधान को चिह्नित किया है। –

+0

@ar, 'STDOUT-> autoflush (1)' '$ | = 1' के समान' $ | = 1' जैसा ही है, वैश्विक है और 'STDOUT-> autoflush (1)' एक हैंडल के लिए विशिष्ट है। –

+0

सिवाय इसके कि आपको 'आईओ :: हैंडल' का उपयोग करना है। ऐसा नहीं है कि 'आईओ :: हैंडल' ईन्स के लिए मानक मॉड्यूल नहीं रहा है, लेकिन ... हाँ। : (' –

2

पूछे जाने वाले प्रश्न How do I flush/unbuffer an output filehandle? Why must I do this? और टिप्पणी देखें:

$| विशेष चर, आप binmode उपयोग कर सकते हैं अपने filehandle एक :unix परत है, जो unbuffered है देने के लिए इसके अलावा

...

सामान्य समस्या के लिए, आप Time::Progress पर देख सकते हैं:

%b

%B

प्रगति बार की तरह जो दिखता है:

##############...................... 
0

क्या मेरे लिए काम किया लाइन डालने के लिए था

STDOUT->autoflush(1); 

मेरी लाइन

print "."; 

अपने मौजूदा पाश अंदर से पहले। चीजों को और भी धीमा करने के डर के लिए नींद का उपयोग नहीं किया।

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

  • कोई संबंधित समस्या नहीं^_^