0

在经过一定时间(毫秒,我正在使用模块)之前如何获取用户输入,Time::HiRes但是如果时间过去并且没有输入,那么什么也不会发生。具体来说,我正在逐字打印一个问题,直到有来自 STDIN 的中断。为此,程序在继续打印之前等待一小段时间,如果没有中断,则打印下一个单词。我该怎么做,或者是更好的选择。谢谢一堆。我的初始程序如下所示:

use Time::HiRes qw/gettimeofday/;
$initial_time = gettimeofday();
until (gettimeofday() - $a == 200000) {
        ;
        if ([<]STDIN[>]) { #ignore the brackets
                print;
        }
}

4

1 回答 1

1

查看Time::HiResualarm中的函数。

它的工作原理与警报类似,因此请查看那里的示例以了解如何使用它。

这是一个完整的例子:

#!/usr/bin/perl

# Simple "Guess the Letter" game to demonstrate usage of the ualarm function
# in Time::HiRes

use Time::HiRes qw/ualarm/;

my @clues = ( "It comes after Q", "It comes before V", "It's not in RATTLE", 
    "It is in SNAKE", "Time's up!" ); 
my $correctAnswer = "S";

print "Guess the letter:\n";

for (my $i=0; $i < @clues; $i++) {
    my $input;

    eval {
        local $SIG{ALRM} = sub { die "alarm\n" }; 
        ualarm 200000;
        $input = <STDIN>;
        ualarm 0;
    };

    if ($@) {
        die unless $@ eq "alarm\n"; # propagate unexpected errors
        # timed out
    }
    else {
        # didn't
        chomp($input);
        if ($input eq $correctAnswer) {
            print "You win!\n";
            last;
        }
        else {
            print "Keep guessing!\n";
        }
    }

    print $clues[$i]."\n";
}

print "Game over man!\n";
于 2013-06-24T03:54:40.727 回答