Я собирался оставить это как комментарий к вашему собственному «ответу», но решил, что мне нужно больше места.
cbreak эквивалентен режиму raw, за исключением того, что cbreak не перехватывает управляющие последовательности, такие как ctrl-c, ctrl-z и т. Д. Они оба собирают символы по одному за раз. Разница в поведении между двумя режимами не является источником вашей проблемы. Если решение Chas делает что-то похожее на то, что вы намеревались, то проблема, скорее всего, связана с тем, что вы отредактировали в своей строке #process input
. Я уже прокомментировал, что ваш оригинальный сценарий работает нормально, если я заполняю его чем-то рудиментарным, чтобы я мог видеть, что он работает. Например, незначительный штрих:
use strict;
use warnings;
use Term::ReadKey;
my ($char, $input, $pause_time);
ReadMode("cbreak");
# Collect all characters typed into $input
# and quit when '#' is typed.
$input = '';
while ($char = ReadKey($pause_time)) {
last if $char eq '#';
$input .= $char;
}
print "$input\n";
Мне не нужно нажимать «enter» в конце этого, и это ничего не даст (кроме броска каретки в $input
и выветривания строки).