Я хотел бы запустить подкоманду из Perl (или передать ее в сценарий Perl) и заставить скрипт обрабатывать вывод команды немедленно, а не ждать тайм-аута, новой строки или определенного количества блоков. Например, допустим, я хочу заключить каждый фрагмент ввода в квадратные скобки. Когда я запускаю скрипт так:
$ ( echo -n foo ; sleep 5 ; echo -n bar ; sleep 5; echo baz) | my_script.pl
Я бы хотел, чтобы вывод был таким, чтобы каждая строка появлялась через пять секунд после предыдущей:
[foo]
[bar]
[baz]
Как мне это сделать?
Это работает, но действительно ужасно:
#! /usr/bin/perl -w
use strict;
use Fcntl;
my $flags = '';
fcntl(STDIN, F_GETFL, $flags);
$flags |= O_NONBLOCK;
fcntl(STDIN, F_SETFL, $flags);
my $rin = '';
vec($rin,fileno(STDIN),1) = 1;
my $rout;
while (1) {
select($rout=$rin, undef, undef, undef);
last if eof();
my $buffer = '';
while (my $c = getc()) {
$buffer .= $c;
}
print "[$buffer]\n";
}
Есть ли более элегантный способ сделать это?