我想从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"; }
有更优雅的方式吗?
从perlfaq5:如何从文件中读取单个字符?从键盘?.您可能还想阅读如何判断文件句柄中是否有字符等待?.轮询文件句柄.如果那里有一个字符,请阅读它并重置一个计时器.如果那里没有角色,请再试一次.如果您已重试并经过一段时间,请处理输入.
阅读完字符后,您可以自行决定如何处理这些字符.阅读单个字符的所有灵活性带来了处理它们的额外工作.