Ich wollte dies eigentlich als Kommentar zu Ihrer eigenen "Antwort" hinterlassen, aber ich habe beschlossen, dass ich mehr Platz brauche.
cbreak entspricht dem Rohmodus, außer dass cbreak keine Steuersequenzen wie ctrl-c, ctrl-z usw. abfängt. Sie sammeln beide ein Zeichen nach dem anderen. Der Unterschied im Verhalten zwischen den beiden Modi ist nicht die Ursache für Ihr Problem. Wenn die Lösung von Chas in etwa das tut, was Sie beabsichtigt haben, dann hat das Problem wahrscheinlich eher mit dem zu tun, was Sie in Ihrem #process input
Linie. Ich habe bereits darauf hingewiesen, dass Ihr ursprüngliches Skript gut funktioniert, wenn ich es mit etwas Rudimentärem fülle, damit ich sehen kann, dass es funktioniert. Zum Beispiel, eine kleine Nachbesserung:
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";
Es besteht keine Notwendigkeit, am Ende die Eingabetaste zu drücken, und dies wird auch nichts bewirken (abgesehen davon, dass ein Zeilenumbruch in $input
und die Zeichenkette durcheinander bringen).