Запуск внешней программы на Perl без одновременного вывода - PullRequest
1 голос
/ 13 июня 2019

У меня есть скрипт на Perl

for my $i (1..10) {
    print "How $i\n";
    sleep(1);
}

Я хочу запустить его из другого сценария perl и записать его вывод. Я знаю, что могу использовать qx () или обратные метки, но они вернут все выходные одновременно, когда программа выйдет.

Но вместо этого я хочу напечатать вывод первого сценария из второго сценария, как только они станут доступны, т.е. для примера кода вывод первого скрипта печатается за десять шагов второго скрипта, а не за один раз.

Я посмотрел на этот вопрос и написал свой второй сценарий как

my $cmd = "perl a.pl";
open my $cmd_fh, "$cmd |";

while(<$cmd_fh>) {
    print "Received: $_\n";
    STDOUT->flush();
}

close $cmd_fh;

Однако вывод все еще печатается одновременно. Я хотел знать, как это сделать?

1 Ответ

3 голосов
/ 13 июня 2019

Дочерний элемент отправляет выходные данные кусками по 4 или КиБ или 8 КиБ, а не по одной строке за раз. Программы Perl, как и большинство программ, сбрасывают STDOUT при переводе строки, но только при подключении к терминалу; в противном случае они полностью буферизуют вывод. Вы можете добавить $| = 1; к дочернему элементу, чтобы отключить буферизацию STDOUT.

Если вы не можете изменить дочерний объект, такие программы можно обмануть, используя псевдо-ttys вместо каналов. См. IPC :: Run . (Найдите в документации «pty».)

...