2012-11-10 8 views
1

내가 Ctrl 키를 예를 a, b, c에 대한 Enter a string: 후 입력 한 다음 두 번 내가 ReadKey에 정지하지 않는 무한 루프를 얻을 D + 그리고 나는 Q 키로 멈출 수 없습니까? 루프를 종료합니다기간 :: ReadKey, "STRG + D"와 STDIN

#!/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"; 
} 

답변

2

당신이 두 Ctrl 키 입력 한 후 - D (EOT)를, 당신을 programm는 NUL 바이트를 받게됩니다. 그리고 그들 무한대. 불행히도 당신은 무한 루프에서 무조건적으로 읽습니다. (예 : q 또는 e이 아닌 다른 문자를 입력하고 세 번째 시도 후에 입력하지 않으면 사용자에게 강의를 제공하거나 제어 문자를 올바르게 구현하십시오. 귀하의 모듈은 입력 에서 모든 제어 문자를 제거하기 전에을 얻지 만 필요한 후크를 제공합니다. Ctrl - C도 추가해야합니다 (숯을 읽을 때가 아니라 선이 예상 될 때만 작동합니다).

또한 입력 문자를 문자열 평등과 비교하지 않으시겠습니까? $c eq "q" 더 읽기 좋습니다.

+0

어떻게'Ctrl'-'D'를 잡을 수 있습니까? –

0

유일한 라인이 하나입니다

last if ord($c) == 113; 

그래서, 루프를 탈출하는 유일한 방법은 프롬프트 입력을 요청할 때 'Q'를 입력하는 '전자 '.

아마도 if 문 안에 last 문을 적절하게 배치해야 ctrl-d 및/또는 텍스트가 종료됩니다.