Подтвердить что ты не робот

Как остановить ввод в Perl?

Первый постер и часть времени perl noobie.

Я делаю рефлекторную игру. Здесь вывод -

__________________________________________________________________________
Reflex game initiated. Press ENTER to begin the game, and then press ENTER 
after the asterisks are printed to measure your reflexes!.


*************************

Your result: 0.285606 seconds.
logout

[Process completed]
__________________________________________________________________________

Есть одна небольшая проблема: - 0-10 секунд (основанная на случайной переменной) после нажатия кнопки ввода, чтобы начать игру и до того, как будут напечатаны звезды. В течение этого времени, если игрок нажимает ENTER, он регистрируется как время рефлекса. Поэтому мне нужно, чтобы мой код не читал кнопку ENTER до того, как будут напечатаны звезды. Код -

#!/usr/bin/perl

use Time::HiRes qw(sleep);
use Time::HiRes qw(gettimeofday);

#random delay variable
$random_number = rand();

print "Reflex game initiated. Press ENTER to begin the game, and then press ENTER after         the asterisks are printed to measure your reflexes!.\n";

#begin button
$begin = <>;

#waits x milliseconds
sleep(10*$random_number);

#pre-game
$start = [ Time::HiRes::gettimeofday() ];

print "\n****************************\n";

#user presses enter
$stop = <>;

#post game
$elapsed = Time::HiRes::tv_interval($start);

#delay time print
print "Your result: ".$elapsed." seconds.\n";
4b9b3361

Ответ 1

Повторяя исходный ответ CanSpice:

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