如何在Perl中停止输入?

use*_*747 10 perl input

我正在做一个反射游戏.这是输出 -

__________________________________________________________________________
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]
__________________________________________________________________________
Run Code Online (Sandbox Code Playgroud)

但是有一个小问题 - 按下Enter键开始游戏之后和星星打印之前有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";
Run Code Online (Sandbox Code Playgroud)

ZnA*_*ArK 4

重复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'";
Run Code Online (Sandbox Code Playgroud)

发生的情况如下:

  • ReadMode 2意思是“将输入模式置于常规模式但关闭回显”。这意味着当您使用计算量大的代码时,用户执行的任何键盘敲击操作都不会回显到屏幕上。但它仍然会进入 的STDIN缓冲区,所以......
  • ReadMode 3变成STDINcbreak 模式,这意味着STDIN每次按键后都会被刷新。这就是为什么...
  • while(defined($key = ReadKey(-1))) {}发生。这会清除用户在计算成本较高的代码中输入的字符。然后...
  • ReadMode 0Resets ,您可以像用户没有敲击键盘一样STDIN读取内容。STDIN

当我运行此代码并在 期间敲击键盘sleep(10),然后在提示后输入一些其他文本时,它只打印出我在提示出现后输入的文本。

严格来说,这ReadMode 2是不需要的,但我把它放在那里,这样当用户敲击键盘时,屏幕就不会被文本弄乱。

  • 一些解释会很好。 (3认同)