Почему STDIN приводит к зависанию моей Perl-программы? - PullRequest
7 голосов
/ 13 октября 2010

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

$perl script.pl
<b>What is the exchange rate?</b> 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 вел себя нормально? Если это нормальное поведение, что я упускаю?

Ответы [ 4 ]

18 голосов
/ 13 октября 2010

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

my @answer = <STDIN>;

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

Если вы вместо этого сделаете:

my $answer = <STDIN>;

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

5 голосов
/ 13 октября 2010

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

my @exchangeRate = <STDIN>;

Я должен был использовать:

my $exchangeRate = <STDIN>;

с $ вместо @.

4 голосов
/ 13 октября 2010

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

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

0 голосов
/ 13 октября 2010

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

Либо

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

, либо

$| = 1;

Вот почему вы не видите напечатанный вывод.1010 * Также вам нужно перейти от массивов '@' к скалярным переменным '$'

$val = <STDIN>;
chomp($val);
...