2010-10-12 21 views
7

Estoy aprendiendo Perl y escribí este script para practicar usando STDIN. Cuando ejecuto el script, solo muestra la primera declaración de impresión en la consola. No importa lo que escriba, incluidas las nuevas líneas, la consola no muestra la siguiente declaración de impresión. (. Estoy usando ActivePerl en una máquina Windows) Parece que este:¿Por qué STDIN causa que se congele mi programa Perl?

$perl script.pl 
What is the exchange rate? 90.45 
[Cursor stays here]

Esta es mi guión:

#!/user/bin/perl 
use warnings; use strict; 

print "What is the exchange rate? "; 
my @exchangeRate = <STDIN>; 
chomp(@exchangeRate); 

print "What is the value you would like to convert? "; 
chomp(my @otherCurrency = <STDIN>); 

my @result = @otherCurrency/@exchangeRate; 
print "The result is @{result}.\n"; 

Una posible solución Noté mientras investigaba mi problema es que pude incluir

use IO::Handle;
y
flush STDIN; flush STDOUT;
en mi secuencia de comandos. Sin embargo, estas líneas no resolvieron mi problema.

¿Qué debo hacer para que STDIN se comporte normalmente? Si esto es comportamiento normal, ¿qué me estoy perdiendo?

Respuesta

18

Al hacer

my @answer = <STDIN>; 

... Perl espera a que el carácter EOF (en Unix y como Unix es Ctrl-D). Luego, cada línea que ingresa (separada por avances de línea) entra en la lista.

Si en lugar de hacerlo:

my $answer = <STDIN>; 

... Perl espera un salto de línea, a continuación, pone la cadena que ha introducido en $answer.

+0

En sistemas UNIX y UNIX, el carácter de fin de línea es avance de línea, no retorno de carro. –

+0

¡Gracias! Me di cuenta de que no estaba usando un escalar después de hacer mi publicación. > _ <¡Gracias por señalar cómo usar STDIN con una matriz! – Kevin

+0

@Chas: gracias por la corrección. He editado mi respuesta. – CanSpice

-3

Puede intentar y habilitar el autoflush.

De cualquier

use IO::Handle; 
STDOUT->autoflush(1); 

o

$| = 1; 

Es por eso que usted no está viendo la salida impresa.

Además, es necesario cambiar de arrays '@' a variables escalares '$'

$val = <STDIN>; 
chomp($val); 
+0

¡Gracias por el consejo! – Kevin

+0

¿Por qué downvote mi respuesta? – krico

5

Encontré mi problema. Estaba usando el tipo incorrecto de variable. En lugar de escribir:

my @exchangeRate = <STDIN>; 

Debería haber usado:

my $exchangeRate = <STDIN>; 

con un $ en lugar de un @.

4

Para finalizar la entrada de línea múltiple, puede usar Control-D en Unix o Control-Z en Windows.

Sin embargo, probablemente solo desee una sola línea de entrada, por lo que debería haber usado un escalar como lo mencionaron otras personas. Learning Perl lo guía a través de este tipo de cosas.

Cuestiones relacionadas