Возникает исключение Python, поскольку процесс чтения (head
) закрывает свой конец, поэтому скрипт получает SIGPIPE
при следующей попытке записи; см. этот пост . Это включало решения в сообществе Python, чтобы изменить настройки по умолчанию, чтобы информировать пользователя (см. Связанный пост).
Это не видно в Perl, потому что он убит этим сигналом (каково его расположение), ничего не сказав. Так что вы можете переопределить это
use warnings;
$| = 1;
$SIG{PIPE} = sub { die $! };
for my $i (0..4_000-1) {
print $i, "\n";
}
(без $| = 1
мне нужно больше 5_000
выше, чтобы это произошло).
Или, скорее, введите warn
(вместо die
), чтобы программа продолжала
local $SIG{PIPE} = sub { warn "Ignoring $_[0]: $!" };
Обновление Учитывая пояснения, приведенные в комментарии, я бы порекомендовал этот обработчик быть глобальным. Это может все еще быть переопределено с local
одним в определенных областях. Кроме того, нет ничего плохого в том, чтобы пережить SIGPIPE
вместо того, чтобы быть уничтоженным, если есть предупреждение.
Обратите внимание, что даже без этого состояние выхода процесса Perl покажет проблему. Запустите echo $?
после того, как процесс "завершится" (тихо завершается); Я получаю 32
в моей системе.
Чтобы подражать поведению Python, вы можете ввести die
в обработчике сигналов и обработать это исключение, поместив все это в eval
.
Спасибо melpomene и ikegami за комментарии.