代码之家  ›  专栏  ›  技术社区  ›  sidyll

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

  •  6
  • sidyll  · 技术社区  · 7 年前

    我正在写一个简单的程序,用于过滤 来自管道的输入。大部分输入作为输出发送 原封不动。它的一部分被修改或用于提取 信息。以最简单的形式,什么也不做 程序 filter

    $|++;
    
    while (<>) {
        print;
    }
    

    主程序有时会输出其任务的进度更新 任务,通过使用 以回车结束的行。将此类内容传送到 滤波器 阻止所有输出:

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

    有没有一种简单的方法来读取同一循环中的这些行 sysread 路?我在找 类似于如果有可能 将记录分隔符设置为“ \n \r ".

    1 回复  |  直到 7 年前
        1
  •  9
  •   mob    7 年前

    如果输入不太大,效率不是一个问题,则此版本的 filter

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