【发布时间】:2014-01-10 00:26:36
【问题描述】:
我正在提示用户输入正确答案,例如:
/> 13 + 7 ?
有什么方法可以让这个输出在 2 秒后消失吗?
..感谢任何建议
【问题讨论】:
我正在提示用户输入正确答案,例如:
/> 13 + 7 ?
有什么方法可以让这个输出在 2 秒后消失吗?
..感谢任何建议
【问题讨论】:
我认为你要求的几件事结合起来:
1) 你如何擦除一行
2)你如何等待输入一段时间然后放弃等待(即计时器)
下面的代码会做你想做的事(还有其他方法可以完成上述两个任务,但下面显示了上述每个任务的一种方法):
use strict; use warnings;
use IO::Select;
my $stdin = IO::Select->new();
$stdin->add(\*STDIN);
# always flush
$| = 1;
my $question = "/> 7 + 3 ? ";
print $question;
if ($stdin->can_read(2)) {
print "you entered: " . <STDIN>;
} else {
print "\010" x length($question);
print " " x length($question);
print "too late\n";
}
【讨论】:
在STDIN上使用select,看2秒内是否有输入。如果不是,请使用回车符 (\r) 或多个退格键 (\b) 覆盖输出。
概念证明:
$| = 1; # needed because print calls don't always use a newline
$i = int(rand() * 10);
$j = int(rand() * 10);
$k = $i + $j;
print "What is $i + $j ? ";
$rin = '';
vec($rin, fileno(STDIN), 1) = 1;
$n = select $rout=$rin, undef, undef, 2.0;
if ($n) {
$answer = <STDIN>;
if ($answer == $k) {
print "You are right.\n";
} else {
print "You are wrong. $i + $j is $k\n";
}
} else {
print "\b \b" x 15;
print "\n\n";
print "Time's up!\n";
sleep 1;
}
当您准备好使用更高级的解决方案时,您可以查看Term::ReadKey(这样您就不必在输入答案后按Enter)或类似@987654327 @ 可以更好地控制终端上任意位置的写入。
【讨论】: