Ответ 1
Похоже, вы можете выполнить это с помощью Term::ReadKey
:
#!perl
use strict;
use warnings;
use 5.010;
use Term::ReadKey;
say "I'm starting to sleep...";
ReadMode 2;
sleep(10);
ReadMode 3;
my $key;
while( defined( $key = ReadKey(-1) ) ) {}
ReadMode 0;
say "Enter something:";
chomp( my $input = <STDIN> );
say "You entered '$input'";
Вот что происходит:
-
ReadMode 2
означает "включить режим ввода в обычный режим, но отключить эхо". Это означает, что любое нажатие клавиатуры, которое пользователь делает, пока вы находитесь в своем дорогостоящем коде, не будет отображаться на экране. Он по-прежнему вводится в буферSTDIN
, поэтому... -
ReadMode 3
превращаетSTDIN
в режим cbreak, что означает, чтоSTDIN
будет очищаться после каждого нажатия клавиши. Вот почему... -
while(defined($key = ReadKey(-1))) {}
. Это вымывание символов, введенных пользователем во время дорогостоящего кода. Тогда... -
ReadMode 0
сбрасываетSTDIN
, и вы можете читать изSTDIN
, как если бы пользователь не ударил по клавиатуре.
Когда я запускаю этот код и нажимаю на клавиатуре во время sleep(10)
, затем введите другой текст после приглашения, он распечатает только текст, который я напечатал после появления приглашения.
Строго говоря, ReadMode 2
не нужен, но я помещаю его туда, чтобы экран не загромождал текст, когда пользователь натыкается на клавиатуру.