2011-12-30 18 views
6

Soy un principiante en Perl (comparado con la gente aquí). Sé lo suficiente como para poder escribir programas para hacer muchas cosas a través del símbolo del sistema. En un momento dado, decidí escribir un juego de comandos que construyó un laberinto y me permitió resolverlo. Además de gráficos de calidad, lo único que faltaba era la capacidad de usar los controles WASD sin presionar Enter después de cada movimiento que hacía en el laberinto.¿Cómo puedo hacer que Perl tome la entrada de STDIN un carácter a la vez?

Para que mi juego funcione, quiero que Perl tome un solo carácter como entrada de STDIN, sin necesidad de usar algo para separar mi entrada, como por defecto \n. ¿Cómo podría lograr esto?

He intentado buscar una respuesta simple en línea y en un libro que tengo, pero parece que no encontré nada. Intenté configurar $/="", pero eso pareció omitir todas las entradas. Creo que puede haber una respuesta realmente simple a mi pregunta, pero también me temo que podría ser imposible.

Además, ¿el $/="" en realidad omite la entrada, o toma la entrada tan rápido que asume que no hay ninguna entrada si no estoy presionando la tecla?

+2

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

+0

@ikegami ¡Perfecto! – PhiNotPi

+0

Posible duplicado de [¿Cómo puedo leer un solo carácter de STDIN usando Perl en Windows?] (Https://stackoverflow.com/questions/2021482/how-do-i-read-a-single-character-from-stdin -using-perl-on-windows) –

Respuesta

4

IO::Prompt se pueden utilizar:

#!/usr/bin/env perl 

use strict; 
use warnings; 

use IO::Prompt; 

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

extracto relevante de perldoc -v '$/' relacionado con el establecimiento de $/ = '':

La entrada de separador de registros, salto de línea por defecto. Esto influye en la idea de Perl de de lo que es una "línea". Funciona como la variable RS de awk, que incluye tratando las líneas vacías como un terminador si se establece en la cadena nula (una línea vacía no puede contener espacios ni pestañas).

1

Si está utilizando * nix, encontrará Curses útil.

Tiene un método getch que hace lo que quiere.

Term::TermKey también parece una posible solución.

Cuestiones relacionadas