加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Perl中,如何在输入到达时立即处理输入,而不是等待换行?

发布时间:2020-12-15 21:16:35 所属栏目:大数据 来源:网络整理
导读:我想从Perl运行一个子命令(或将它传递给Perl脚本)并让脚本立即处理命令的输出,而不是等待超时,换行或一定数量的块.例如,假设我想用方括号括住每个输入块.当我像这样运行脚本时: $( echo -n foo ; sleep 5 ; echo -n bar ; sleep 5; echo baz) | my_script.p
我想从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);
  last if eof();

  my $buffer = '';

  while (my $c = getc()) {
    $buffer .= $c;
  }

  print "[$buffer]n";
}

有更优雅的方式吗?

解决方法

从perlfaq5: How can I read a single character from a file? From the keyboard?.您可能还想阅读 How can I tell whether there’s a character waiting on a filehandle?.轮询文件句柄.如果那里有一个字符,请阅读它并重置一个计时器.如果那里没有角色,请再试一次.如果您已重试并经过一段时间,请处理输入.

阅读完字符后,您可以自行决定如何处理这些字符.阅读单个字符的所有灵活性带来了处理它们的额外工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读