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

sid*_*yll 6 io perl stdin

我正在编写一个简单的程序,用于过滤来自管道的输入.大多数输入都是未触及的输出.部分内容被修改或用于提取信息.最简单的形式 - 无所事事 - 该计划filter是:

$|++;

while (<>) {
    print;
}
Run Code Online (Sandbox Code Playgroud)

主程序有时会输出其任务的进度更新,通过使用以回车结束的行来覆盖相同的可视内容.管道此类内容以 filter阻止所有输出:

$ perl -e '$|++; print ++$a, "\r" and sleep 1 while 1' | filter
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方法以相同的循环方式读取这些行,或者我应该走的sysread路?我正在寻找类似于如果可以将记录分隔符设置为" \n 或 \r "的情况.

mob*_*mob 8

如果输入不是那么大以至于效率是一个问题,那么这个版本filter更加强大

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