Потому что STDOUT
буферизуется. Предупреждение приходит через STDERR
до того, как STDOUT
вспыхнет.
По умолчанию warn()
переходит на STDERR
, а print
переходит на STDOUT
. В вашем текущем коде вы видите, что STDERR
сбрасывается до STDOUT
Вы можете изменить это поведение, добавив в начало следующее:
select STDERR; $| = 1;
select STDOUT; $| = 1;
Это устанавливает STDOUT
и STDERR
для небуферизованного и сбрасывания на каждом отпечатке.