Как сделать вывод внешней команды автозаполнением с AnyEvent :: Subprocess? - PullRequest
1 голос
/ 07 мая 2019

Я пытаюсь контролировать вывод внешней команды с помощью AnyEvent::Subprocess:

use feature qw(say);
use strict;
use warnings;

use AnyEvent::Subprocess;

my $job = AnyEvent::Subprocess->new(
    delegates     => [ 'StandardHandles', 'CompletionCondvar' ],
    code          => 'myscript.pl',
);
my $run = $job->run;
my $condvar = $run->delegate('completion_condvar');

$run->delegate('stdout')->handle->on_read(
    sub {
        my ( $handle ) = @_;
        my $line = $handle->rbuf;
        chomp $line;
        say "Got output: '$line'";
        $handle->rbuf = ""; # clear buffer
      }
);
my $done = $condvar->recv;

Как правило, у меня нет доступа к исходному коду внешнего скрипта, поэтому я не могу вставить в скрипт такие команды, как STDOUT->autoflush(1) (если это скрипт Perl).

Вот тестовый скрипт, который я использовал для тестирования:

myscript.pl

use feature qw(say);
use strict;
use warnings;

#STDOUT->autoflush(1);
sleep 1;
say "data 1";
sleep 1;
say "data 2";
sleep 1;
say "data 3";

Выход поступает сразу после завершения myscript.pl. Я хочу напечатать каждую строку из myscript.pl, когда она станет доступной. Как это можно сделать без изменения myscript.pl?

...