我想从Perl运行一个子命令(或将其传递给Perl脚本)并让脚本立即处理命令的输出,而不是等待超时,换行或一定数量的块.例如,假设我想用方括号包围每个输入块.当我像这样运行脚本时:
$ ( echo -n foo ; sleep 5 ; echo -n bar ; sleep 5; echo baz) | my_script.pl
Run Code Online (Sandbox Code Playgroud)
我希望输出是这样的,每一行出现在前一行之后五秒:
[foo]
[bar]
[baz]
Run Code Online (Sandbox Code Playgroud)
我怎么做?
这有效,但真的很难看:
#! /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 …
Run Code Online (Sandbox Code Playgroud) perl ×1