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 に答える