2012-02-28 30 views
11

Estoy tratando de escribir una secuencia de comandos de Perl que lea los datos canalizados, luego solicita al usuario que ingrese en función de esos datos. La siguiente secuencia de comandos, prompt_for_action, es lo que yo estoy tratando de hacer:¿Puedo solicitar la entrada del usuario después de leer la entrada canalizada en STDIN en Perl?

#!/usr/bin/perl 

my @hosts =(); 
while (<>) { 
    my $host = $_; 
    $host =~ s/\n//; # strip newlines 
    push(@hosts, $host); 
} 

for my $host (@hosts) { 
    print "Do you want to do x with $host ? y/n: "; 
    chomp(my $answer = <>); 
    print "You said `$answer`.\n"; 
} 

pero cuando lo ejecuto no hay que esperar la entrada del usuario, sólo se sopla a través sin esperar a que yo escribo:

$ echo "test1.example.com 
> test2.example.com" | ./prompt_for_action 
Do you want to do x with test1.example.com ? y/n: You said ``. 
Do you want to do x with test2.example.com ? y/n: You said ``. 

Si no leo mis datos de la entrada estándar ...

#!/usr/bin/perl 

my @hosts = ('test1.example.com', 'test12.example.com'); 

for my $host (@hosts) { 
    print "Do you want to do x with $host ? y/n: "; 
    chomp(my $answer = <>); 
    print "You said `$answer`.\n"; 
} 

entonces la escritura funciona bien:

$ ./prompt_for_action 
Do you want to do x with test1.example.com ? y/n: y 
You said `y`. 
Do you want to do x with test12.example.com ? y/n: n 
You said `n`. 

¿Está conectado a STDIN y luego solicita la entrada del usuario? ¿Si es así, cómo?

+1

Es increíble lo bueno que es Perl para romper los sistemas de resaltado de sintaxis. – sidyll

Respuesta

11

En sistemas Unix-y, puede abrir el pseudo archivo /dev/tty para leer.

while (<STDIN>) { 
    print "from STDIN: $_"; 
} 
close STDIN; 

# oops, need to read something from the console now 
open TTY, '<', '/dev/tty'; 
print "Enter your age: "; 
chomp($age = <TTY>); 
close TTY; 
print "You look good for $age years old.\n"; 
+0

¡Gracias! El TTY funciona como un encanto. –

+0

pude cerrar STDIN, luego: abrir STDIN, "<", "/ dev/tty", ¿hay alguna razón por la que no deba hacer esto? No parecía tener ningún efecto secundario por lo que pude ver. Obviamente, hacer este tipo de programación "valiente" no es aconsejable para programas grandes, pero las herramientas pequeñas deberían estar bien ¿no? – osirisgothra

-2

Una vez que canaliza algo a través de STDIN, su anterior STDIN (entrada de teclado) está siendo reemplazada por la tubería. Entonces no creo que esto sea posible.

Cuestiones relacionadas