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

How to read unbuffered input of lines ending with "\r" or "\n"?

我正在编写一个旨在过滤的简单程序 来自管道的输入。大多数输入作为输出发送 原封不动。其中一部分被修改或用于提取 信息。以最简单的形式——什么都不做—— 程序 filter 是:

$|++;

while (<>) {
    print;
}

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

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

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

如果输入不是很大,效率不是问题,这个版本的 filter 更健壮

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