2011-09-29 12 views
10

पर्ल में एसटीडीआईएन बफर को साफ़ करने का कोई तरीका है? मेरे कार्यक्रम का एक हिस्सा लंबा आउटपुट (किसी के लिए कुछ पात्रों में प्रवेश करने के लिए पर्याप्त समय है) और उस आउटपुट के बाद मैं इनपुट मांगता हूं, लेकिन यदि आउटपुट के दौरान वर्ण दर्ज किए गए थे, तो इनपुट में जो कुछ भी दर्ज किया गया है, वे "tacked" हैं अंश। यहां मेरी समस्या का एक उदाहरण दिया गया है:फ्लशिंग पर्ल एसटीडीआईएन बफर

for(my $n = 0; $n < 70000; $n++){ 
    print $n . "\n"; 
} 
chomp(my $input = <STDIN>); 
print $input . "\n"; 

आउटपुट में लूप के आउटपुट के दौरान दर्ज किए गए किसी भी वर्ण शामिल होंगे। मैं या तो एसटीडीआईएन को कैसे अक्षम कर सकता हूं या एसटीडीआईएन बफर फ्लश कर सकता हूं (या किसी अन्य तरीके से इसे कॉल करने से पहले अतिरिक्त वर्णों को एसटीडीआईएन में डालने की इजाजत नहीं दी जा सकती है)?

+0

ठीक है, मैं अब 3 दिनों के लिए इस प्रश्न का उत्तर की तलाश में था (नहीं हर घंटे हर दिन, लेकिन मैं कम से कम 3 या 4 घंटे प्रति दिन कहूंगा) और अभी तक कोई जवाब नहीं मिला है, वास्तव में मैंने अपने सहयोगियों से पूछा, जो पर्ल को भी जानते हैं और उनका उपयोग करते हैं, और वे या तो नहीं जानते हैं, इसलिए मुझे विश्वास है कि मैंने आपके द्वारा लगाए गए प्रयासों की तुलना में अधिक प्रयास किए हैं, मैंने कहा है कि, क्या आपको कोई विचार है कि मैं जो पूछ रहा हूं उसे कैसे करना है? क्योंकि मैंने लगभग 3 दिन पहले आपके लिंक को देखा है, उन कार्यों को इस तरह से कार्यान्वित करने का प्रयास किया है जो तर्कसंगत रूप से इस समस्या को ठीक करेगा, और यह काम नहीं करता है। – mcwillig

+1

'आईओ :: हैंडल का उपयोग करें; एसटीडीआईएन-> ऑटोफ्लश (1); ' –

+0

आपके उत्तर के लिए धन्यवाद, लेकिन, इसने समस्या को ठीक नहीं किया है, मुझे भी याद है कि ऑटोफ्लश पढ़ने और फ्लश आउटपुट के लिए केवल अच्छे हैं, जैसे एसटीडीईआरआर और एसटीडीओयूटी के रूप में, इनपुट नहीं। जब मैंने आपके द्वारा सुझाए गए प्रयासों की कोशिश की, तो मुझे अभी भी लूप के आउटपुट के दौरान दर्ज किए गए पात्र और साथ ही मैंने एसटीडीआईएन में जो भी दर्ज किया था, उसे प्राप्त किया। – mcwillig

उत्तर

13

ऐसा लगता है कि आप Term::ReadKey मॉड्यूल के साथ ऐसा कर सकते हैं:

#!perl 

use strict; 
use warnings; 
use 5.010; 

use Term::ReadKey; 

say "I'm starting to sleep..."; 
ReadMode 2; 
sleep(10); 
ReadMode 3; 
my $key; 
while(defined($key = ReadKey(-1))) {} 
ReadMode 0; 
say "Enter something:"; 
chomp(my $input = <STDIN>); 
say "You entered '$input'"; 

यहाँ क्या होता है:

  • ReadMode 2 का अर्थ है "नियमित मोड में इनपुट मोड डाल लेकिन गूंज बंद कर देते हैं।" इसका अर्थ यह है कि जब आप अपने कम्प्यूटेशनल-महंगे कोड में हों तो उपयोगकर्ता द्वारा किए जाने वाले किसी भी कीबोर्ड को स्क्रीन पर प्रतिबिंबित नहीं किया जाएगा। यह अभी भी STDIN के बफर में प्रवेश किया जाता है, इसलिए ...
  • ReadMode 3STDIN को क्रैक मोड में बदलता है, जिसका अर्थ है STDIN प्रत्येक कुंजीपटल के बाद फ्लश हो जाता है। यही कारण है कि ...
  • while(defined($key = ReadKey(-1))) {} होता है। यह उन पात्रों को फ़्लश कर रहा है जो उपयोगकर्ता ने कम्प्यूटेशनल-महंगा कोड के दौरान दर्ज किया था। फिर ...
  • ReadMode 0STDIN रीसेट करता है, और आप STDIN से पढ़ सकते हैं जैसे कि उपयोगकर्ता कीबोर्ड पर टक्कर नहीं लगा था।

जब मैं sleep(10) के दौरान इस कोड और कीबोर्ड पर धमाके चलाने के लिए, तो शीघ्र बाद कुछ अन्य पाठ दर्ज करें, यह केवल बाहर पाठ के बाद शीघ्र दिखाई दिया मैं टाइप किया प्रिंट करता है।

ReadMode 2 कड़ाई से बोलने की आवश्यकता नहीं है, लेकिन मैंने इसे वहां रखा है ताकि जब उपयोगकर्ता कुंजीपटल पर बैंग करता है तो स्क्रीन टेक्स्ट के साथ चिपक जाती नहीं है।

-4
{ local $/; <STDIN> } 

यह अस्थायी रूप से - ब्लॉक के दायरे तक ही सीमित - $ /, इनपुट रिकॉर्ड विभाजक, सेट undef होने के लिए है, जो बताता है कि पर्ल एक समय में एक लाइन पढ़ने के बजाय सब कुछ पढ़ने के लिए। फिर एसटीडीआईएन पर उपलब्ध सब कुछ पढ़ता है और इसके साथ कुछ भी नहीं करता है, इस प्रकार बफर को फ्लश करता है।

उसके बाद, आप सामान्य रूप से एसटीडीआईएन पढ़ सकते हैं।

+2

यह काम नहीं करेगा। '' कॉल ब्लॉक तब तक "रिकॉर्ड" पढ़ा जा सकता है। लेकिन अगर '$ /' 'undef' है, तो रिकॉर्ड का कोई अंत नहीं हो सकता है, इसलिए जब तक ईओएफ तक नहीं पहुंच जाता तब तक यह अवरुद्ध हो जाएगा। – mob

0

मैं एक ही समस्या थी और सिर्फ इस तरह प्रसंस्करण के बाद STDIN में कुछ भी की निकालने से इसे हल:

for(my $n = 0; $n < 70000; $n++){ 
    print $n . "\n"; 
} 
my $foo=<STDIN>; 
print "would you like to continue [y/n]: "; 
chomp(my $input = <STDIN>); 
print $input . "\n"; 
+0

- बस एहसास हुआ कि यह केवल तभी काम करता है जब प्रसंस्करण के दौरान वापसी हो, अन्यथा यह तब तक रुक जाएगा जब तक कि कोई व्यक्ति प्रवेश नहीं करता –

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