2011-12-30 22 views
6

Sono un po 'un principiante al Perl (rispetto alle persone qui). Ne so abbastanza per essere in grado di scrivere programmi per fare molte cose con il prompt dei comandi. A un certo punto, ho deciso di scrivere un gioco di prompt dei comandi che ha costruito un labirinto e mi ha permesso di risolverlo. Oltre alla grafica di qualità, l'unica cosa che mancava era la possibilità di usare i controlli di WASD senza premere Invio dopo ogni mossa che avevo fatto nel labirinto.In che modo Perl può ricevere input da STDIN un carattere alla volta?

Per far funzionare il mio gioco, voglio essere in grado di far prendere a Perl un singolo carattere come input da STDIN, senza che io debba usare qualcosa per separare il mio input, come il default \n. Come potrei realizzare questo?

Ho provato a cercare una semplice risposta in linea e in un libro che ho, ma non ho trovato nulla. Ho provato a impostare $/="", ma questo sembrava ignorare tutti gli input. Penso che possa esserci una risposta molto semplice alla mia domanda, ma temo anche che potrebbe essere impossibile.

Inoltre, lo $/="" in realtà esclude l'input, o prende l'input così rapidamente da presupporre che non ci sia alcun input se non sto già premendo il tasto?

+2

[Term :: ReadKey] (http://search.cpan.org/perldoc?Term::PreadKey) – ikegami

+0

@ikegami Perfetto! – PhiNotPi

+0

Possibile duplicato di [Come si legge un singolo carattere da STDIN utilizzando Perl su Windows?] (Https://stackoverflow.com/questions/2021482/how-do-i-read-a-single-character-from-stdin -utilizzando-perl-on-finestre) –

risposta

4

IO::Prompt può essere utilizzato:

#!/usr/bin/env perl 

use strict; 
use warnings; 

use IO::Prompt; 

my $key = prompt '', -1; 
print "\nPressed key: $key\n"; 

estratto Rilevante da perldoc -v '$/' correlato all'impostazione $/ = '':

Il separatore di record in ingresso, a capo di default. Ciò influenza l'idea di Perl di cosa sia una "linea". Funziona come la variabile RS di awk, incluso trattando le righe vuote come un terminatore se impostato sulla stringa nulla (una riga vuota non può contenere spazi o tabulazioni).

1

Se si utilizza * nix, è disponibile Curses.

Ha un metodo getch che fa quello che vuoi.

Term::TermKey sembra anche una potenziale soluzione.

Problemi correlati