2012-06-21 12 views
10

Prima volta poster e part-time perl noobie.Come fermare l'input in Perl?

Sto facendo un gioco di riflessi. Ecco l'output -

__________________________________________________________________________ 
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] 
__________________________________________________________________________ 

C'è un piccolo problema però - C'è 0-10 secondi (sulla base di una variabile casuale) dopo aver premuto Invio per avviare il gioco e prima che le stelle sono stampati. Durante quel tempo, se il giocatore preme ENTER, viene registrato come il tempo riflesso. Quindi ho bisogno di un modo per impedire al mio codice di leggere il loro pulsante ENTER prima che le stelle vengano stampate. Il codice -

#!/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

le stelle non sono state stampate nell'output, mi dispiace. sono proprio tra i "tuoi relexes" e "stampati per misurare i tuoi riflessi". – user1472747

+0

possibile duplicato di [Flushing Perl STDIN buffer] (http://stackoverflow.com/questions/7602861/flushing-perl-stdin-buffer) – pilcrow

risposta

4

Ripetendo dalla original answer da CanSpice:

Sembra Term::ReadKey può aiutare.

#!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'"; 

Ecco cosa succede:

  • ReadMode 2 significa "mettere la modalità di ingresso in modo regolare, ma spegnere echo". Ciò significa che qualsiasi battito della tastiera che l'utente fa mentre sei nel tuo codice computazionalmente costoso non verrà visualizzato sullo schermo. Viene comunque immesso nel buffer STDIN, quindi ...
  • ReadMode 3 trasforma STDIN in modalità cbreak, ovvero STDIN si arrossisce dopo ogni pressione di un tasto. Ecco perché ...
  • while(defined($key = ReadKey(-1))) {} accade. Questo è lo svuotamento dei caratteri che l'utente ha inserito durante il codice computazionalmente costoso. Quindi ...
  • ReadMode 0 ripristina STDIN e puoi leggere da STDIN come se l'utente non avesse battuto sulla tastiera.

Quando ho eseguito questo codice e botto sulla tastiera durante la sleep(10), quindi inserire qualche altro testo dopo il prompt, viene stampato solo il testo ho digitato dopo è apparso il prompt.

Strettamente parlando, lo ReadMode 2 non è necessario, ma l'ho messo lì in modo che lo schermo non diventi ingombrante di testo quando l'utente batte sulla tastiera.

+3

Alcune spiegazioni sarebbero belle. – TLP

+0

Spiegazione aggiunta. – ZnArK

+0

Questa risposta (codice e spiegazione) è copiata letteralmente dalla "Risposta originale" eccetto per la citazione introduttiva e il collegamento/modifica. Forse, invece di duplicare le risposte, dovremmo chiudere la questione come un duplicato? – pilcrow