1

Enter a string:たとえば、、、の後にa2b回入力cすると、停止せず、キーで停止できない無限ループが発生しCtrlますか?DReadKeyQ

#!/usr/bin/env perl
use warnings;
use 5.10.1;
use Term::ReadKey;

while( 1 ) {
    my $c;
    say "Press the \"q\" key to quit.";
    print "Press the \"e\" key to enter a string: ";
    {
        $|++;
        Term::ReadKey::ReadMode 'ultra-raw';
        $c = ReadKey 0;
        Term::ReadKey::ReadMode 'restore';        
    }
    exit if ord( $c ) == 3; # Control C
    last if $c eq 'q'; 
    if ( $c eq 'e' ) {
        print "\nEnter a string: ";
        my $string = <>;
        if ( not defined $string ) {
            say "Undefined";
        }
        else {
            chomp $string;
            say "You entered |$string|";
        }
    }
    say "Still running";
}
4

2 に答える 2

2

2つを入力した後Ctrl- D(EOT)、プログラムはNULバイトのみを受け取ります。そしてそれらの無限大。残念ながら、無限ループで無条件に読み取られます。これを変更するか(たとえば、ユーザーがまたは以外の何かを入力した場合はユーザーにレッスンを提供し、3回目の試行後にユーザーがそれを取得しなかった場合は終了します)、または制御文字を正しく実装しますqeモジュールは、入力を取得する前に、入力からすべての制御文字を取り除きますが、必要なフックを提供します。Ctrl-も追加することをお勧めCします(文字が読み取られているときではなく、行が予期されているときにのみ機能します)。

また、入力文字を文字列の等式と比較してみませんか?$c eq "q"読みやすくなります。

于 2012-11-10T11:32:17.507 に答える
0

ループを終了する唯一の行は次のとおりです。

last if ord( $c ) == 113;

したがって、ループを回避する唯一の方法は、プロンプトで「e」の入力を求められたときに「q」を入力することです。

おそらく、ctrl-dやテキストが終了するようにlast、ステートメント内に適切に配置する必要があります。if

于 2012-11-10T11:29:24.763 に答える