2010-10-12 2 views
7

Я изучаю Perl и написал этот скрипт для практики с использованием STDIN. Когда я запускаю скрипт, он отображает только первый оператор печати на консоли. Независимо от того, что я набираю, включая новые строки, консоль не отображает следующий оператор печати. (. Я использую ActivePerl на машине Windows) Это выглядит следующим образом:Почему STDIN заставляет мою программу Perl замерзать?

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

Это мой сценарий:

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

Одним из возможных решений, я заметил, исследуя моя проблема в том, что я мог бы включать в себя

use IO::Handle;
и
flush STDIN; flush STDOUT;
в моем сценарии. Однако эти строки не помогли решить мою проблему.

Что делать, если STDIN ведет себя нормально? Если это нормальное поведение, чего мне не хватает?

ответ

18

Когда вы делаете

my @answer = <STDIN>; 

... Perl ждет EOF символа (на Unix и Unix - как это Ctrl-D). Затем каждая строка, которую вы вводите (разделенная линейными переводами), входит в список.

Если вы вместо того, чтобы сделать:

my $answer = <STDIN>; 

... Perl ожидает перевода строки, а затем помещает строку, введенную в $answer.

+0

В UNIX и UNIX-подобной системе конец символа линии является переводом строки, а не возвратом каретки. –

+0

Спасибо! Я понял, что после того, как сделал свой пост, я не использовал скаляр. > _ <Спасибо за указание, как использовать STDIN с массивом! – Kevin

+0

@ Час: Спасибо за исправление. Я отредактировал свой ответ. – CanSpice

-3

Вы можете попробовать и включить автозапуск.

Либо

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

или

$| = 1; 

Вот почему вы не видите выход распечатаны.

Кроме того, вам необходимо изменить из массива '@' для скалярных переменных '$'

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

Благодарим вас за советы! – Kevin

+0

Зачем снижать мой ответ? – krico

5

Я нашел свою проблему. Я использовал неправильный тип переменной. Вместо того чтобы писать:

my @exchangeRate = <STDIN>; 

я использовал:

my $exchangeRate = <STDIN>; 

с $ вместо @.

4

Для завершения многострочного ввода вы можете использовать Control-D для Unix или Control-Z в Windows.

Однако, возможно, вам просто нужна была одна строка ввода, поэтому вы должны были использовать скаляр, как упомянуты другие люди. Изучение Perl проводит вас через этот материал.