如何读取以“ \ r”或“ \ n”结尾的行的无缓冲输入?

时间:2018-12-20 19:48:36

标签: perl io stdin

我正在编写一个用于过滤的简单程序 来自管道的输入。大部分输入作为输出发送 无动于衷。它的一部分被修改或用于提取 信息。最简单的形式-无所作为- 程序filter是:

$|++;

while (<>) {
    print;
}

主程序有时会输出其进度更新 任务,通过使用覆盖相同的视觉内容 以回车结尾的行。将此类内容投放到 filter阻止所有输出:

$ perl -e '$|++; print ++$a, "\r" and sleep 1 while 1' | filter

有没有一种简单的方法可以在同一循环中读取这些行 时尚,还是应该采用sysread的方式?我在找 类似的事情,如果可能的话 将记录分隔符设置为“ \n \r”。

1 个答案:

答案 0 :(得分:8)

如果输入的大小不是很大,那么效率是一个问题,那么此版本的filter会更可靠

while (!eof(STDIN)) {
    $_ .= getc(STDIN);
    if (/[\r\n]/) {
        # manipulate $_, if desired
        print;
        $_ = "";
    }
}
print;