【发布时间】:2010-09-17 20:28:23
【问题描述】:
我想从 Perl 运行一个子命令(或将其通过管道传输到 Perl 脚本中)并让脚本立即处理命令的输出,而不是等待超时、换行符或一定数量的块。例如,假设我想用方括号将每个输入块括起来。当我像这样运行脚本时:
$ ( echo -n foo ; sleep 5 ; echo -n bar ; sleep 5; echo baz) | my_script.pl
我希望输出是这样的,每行在前一行之后出现 5 秒:
[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";
}
有更优雅的方法吗?
【问题讨论】:
标签: perl