Непонятное выполнение сценария Perl - PullRequest
2 голосов
/ 15 марта 2011

Исполнение моего perl scipt мне неясно.Он не выполняет строку за строкой, и я не знаю почему?

Код:

#!usr/bin/perl -w
#line 200 "Level Check"
print "\n1";
$level=554;
if($level > 550){
warn "Level Higher Than 550 ($level)";
}
print "\n2";

Вывод:

Уровень выше, чем550 (554) на линии проверки уровня 203.

1

2

Почему не выводится:

1

Уровень выше, чем 550 (554) на линии проверки уровня 203.

2

Ответы [ 3 ]

11 голосов
/ 15 марта 2011

Потому что STDOUT буферизуется. Предупреждение приходит через STDERR до того, как STDOUT вспыхнет.

По умолчанию warn() переходит на STDERR, а print переходит на STDOUT. В вашем текущем коде вы видите, что STDERR сбрасывается до STDOUT

Вы можете изменить это поведение, добавив в начало следующее:

select STDERR; $| = 1;
select STDOUT; $| = 1; 

Это устанавливает STDOUT и STDERR для небуферизованного и сбрасывания на каждом отпечатке.

1 голос
/ 16 марта 2011

Как уже говорили другие, это из-за буферизации.И STDOUT, и STDERR подключаются к терминалу (AKA tty) и вывод на него буферизуется до новой строки;тогда это напечатано.У вас есть:

print "\n1";

, что означает, что 1 будет буферизироваться до следующей новой строки.Если бы вы написали:

print "1\n";

Это было бы распечатано сразу.

1 голос
/ 15 марта 2011

Как указано выше, одна из ваших проблем IO-буферизации.

Другая проблема заключается в том, что наш результат (после устранения проблемы с буферизацией) будет:

 \n
 1Level Higher Than 550 (554) at Level Check line 203.\n
 2

вместо:

 1\n
 Level Higher Than 550 (554) at Level Check line 203.\n
 2\n

что, я думаю, ты ожидаешь. ('\ n' добавлено для ясности). Причина может быть очевидна ...

Пол

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...