Похоже, что вы можете сделать это с помощью модуля 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
не нужен, но я поместил его туда, чтобы экран не загромождался текстом, когда пользователь стучит по клавиатуре.