2012-06-21 7 views
10

पहली बार पोस्टर और अंशकालिक perl noobie।पर्ल में इनपुट कैसे रोकें?

मैं एक रिफ्लेक्स गेम बना रहा हूं। यहाँ उत्पादन है -

__________________________________________________________________________ 
Reflex game initiated. Press ENTER to begin the game, and then press ENTER 
after the asterisks are printed to measure your reflexes!. 


************************* 

Your result: 0.285606 seconds. 
logout 

[Process completed] 
__________________________________________________________________________ 

नहीं है एक छोटी सी समस्या है, हालांकि - वहाँ 0-10 सेकंड (एक यादृच्छिक चर के आधार पर) के बाद आप खेल शुरू करने के लिए और सितारों मुद्रित कर रहे हैं इससे पहले कि दबाएं। उस समय, यदि खिलाड़ी ENTER दबाता है, तो यह उनके रिफ्लेक्स समय के रूप में लॉग होता है। इसलिए सितारों को मुद्रित करने से पहले मुझे अपने कोड को अपने एंटर बटन पढ़ने से रोकने का एक तरीका चाहिए। कोड -

#!/usr/bin/perl 

use Time::HiRes qw(sleep); 
use Time::HiRes qw(gettimeofday); 

#random delay variable 
$random_number = rand(); 

print "Reflex game initiated. Press ENTER to begin the game, and then press ENTER after   the asterisks are printed to measure your reflexes!.\n"; 

#begin button 
$begin = <>; 

#waits x milliseconds 
sleep(10*$random_number); 

#pre-game 
$start = [ Time::HiRes::gettimeofday() ]; 

print "\n****************************\n"; 

#user presses enter 
$stop = <>; 

#post game 
$elapsed = Time::HiRes::tv_interval($start); 

#delay time print 
print "Your result: ".$elapsed." seconds.\n"; 
+0

सितारों ने आउटपुट में प्रिंट नहीं किया, इसके बारे में खेद है। वे 'आपके प्रतिबिंब:' और 'आपके प्रतिबिंबों को मापने के लिए मुद्रित' के बीच में सही हैं। – user1472747

+0

[फ्लशिंग पर्ल एसटीडीआईएन बफर] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/7602861/flushing-perl-stdin-buffer) – pilcrow

उत्तर

4

CanSpice द्वारा original answer से दोहरा:

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 कड़ाई से बोलने की आवश्यकता नहीं है, लेकिन मैंने इसे वहां रखा है ताकि जब उपयोगकर्ता कुंजीपटल पर बैंग करता है तो स्क्रीन टेक्स्ट के साथ चिपक जाती नहीं है।

+3

कुछ स्पष्टीकरण अच्छा होगा। – TLP

+0

स्पष्टीकरण जोड़ा गया। – ZnArK

+0

यह उत्तर (कोड और स्पष्टीकरण) शब्दकोष उद्धरण और संपादन/लिंक को छोड़कर "मूल उत्तर" से प्रतिलिपि बनाई गई है। शायद जवाब देने के बजाय हमें प्रश्न को डुप्लिकेट के रूप में बंद करना चाहिए? – pilcrow

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