Как прочитать небуферизованный ввод строк, заканчивающихся на "\ r" или "\ n"? - PullRequest
0 голосов
/ 20 декабря 2018

Я пишу простую программу, которая предназначена для фильтрации ввода из конвейера.Большая часть входных данных отправляется как нетронутая.Часть его модифицируется или используется для извлечения информации.В простейшем виде - ничего не делая - программа filter выглядит следующим образом:

$|++;

while (<>) {
    print;
}

Основная программа иногда выводит обновления выполнения своей задачи, перезаписывая то же визуальное содержимое, используя строки, заканчивающиеся символом возврата каретки.,Передача такого содержимого в filter блокирует весь вывод:

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

Есть ли простой способ прочитать эти строки в том же цикле, или я должен пойти по пути sysread?Я ищу что-то похожее на то, что произошло бы, если бы можно было установить разделитель записей на "\n или \r".

1 Ответ

0 голосов
/ 20 декабря 2018

Если входной сигнал не настолько велик, что эффективность является проблемой, эта версия filter является более надежной

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