如何读取以“\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;
我正在编写一个旨在过滤的简单程序
来自管道的输入。大多数输入作为输出发送
原封不动。其中一部分被修改或用于提取
信息。以最简单的形式——什么都不做——
程序 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;