我正在编写一个简单的程序,用于过滤来自管道的输入.大多数输入都是未触及的输出.部分内容被修改或用于提取信息.最简单的形式 - 无所事事 - 该计划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 "的情况.
如果输入不是那么大以至于效率是一个问题,那么这个版本filter更加强大
while (!eof(STDIN)) {
$_ .= getc(STDIN);
if (/[\r\n]/) {
# manipulate $_, if desired
print;
$_ = "";
}
}
print;
Run Code Online (Sandbox Code Playgroud)