2012-06-21 37 views
10

Áp phích đầu tiên và bán thời gian perl noobie.Làm thế nào để dừng đầu vào trong Perl?

Tôi đang tạo trò chơi phản xạ. Đây là kết quả đầu ra -

__________________________________________________________________________ 
Reflex game initiated. Press ENTER to begin the game, and then press ENTER 
after the asterisks are printed to measure your reflexes!. 


************************* 

Your result: 0.285606 seconds. 
logout 

[Process completed] 
__________________________________________________________________________ 

Có một vấn đề nhỏ - sau khi bạn nhấn enter để bắt đầu trò chơi và trước khi các ngôi sao được in. Trong thời gian đó, nếu người chơi nhấn ENTER, nó sẽ được ghi lại là thời gian phản xạ của họ. Vì vậy, tôi cần một cách để ngăn chặn mã của tôi từ đọc nút ENTER của họ trước khi các ngôi sao được in. Mã này -

#!/usr/bin/perl 

use Time::HiRes qw(sleep); 
use Time::HiRes qw(gettimeofday); 

#random delay variable 
$random_number = rand(); 

print "Reflex game initiated. Press ENTER to begin the game, and then press ENTER after   the asterisks are printed to measure your reflexes!.\n"; 

#begin button 
$begin = <>; 

#waits x milliseconds 
sleep(10*$random_number); 

#pre-game 
$start = [ Time::HiRes::gettimeofday() ]; 

print "\n****************************\n"; 

#user presses enter 
$stop = <>; 

#post game 
$elapsed = Time::HiRes::tv_interval($start); 

#delay time print 
print "Your result: ".$elapsed." seconds.\n"; 
+0

các sao không in ở đầu ra, xin lỗi về điều đó. họ đang ở ngay giữa 'relexes của bạn:' và 'in để đo phản xạ của bạn'. – user1472747

+0

có thể trùng lặp của [Flushing Perl STDIN buffer] (http://stackoverflow.com/questions/7602861/flushing-perl-stdin-buffer) – pilcrow

Trả lời

4

Lặp lại từ original answer bởi CanSpice:

Hình như Term::ReadKey có thể giúp đỡ.

#!perl 

use strict; 
use warnings; 
use 5.010; 

use Term::ReadKey; 

say "I'm starting to sleep..."; 
ReadMode 2; 
sleep(10); 
ReadMode 3; 
my $key; 
while(defined($key = ReadKey(-1))) {} 
ReadMode 0; 
say "Enter something:"; 
chomp(my $input = <STDIN>); 
say "You entered '$input'"; 

Đây là những gì sẽ xảy ra:

  • ReadMode 2 có nghĩa là "đặt chế độ đầu vào chế độ bình thường nhưng tắt echo". Điều này có nghĩa là bất kỳ thao tác gõ bàn phím nào mà người dùng thực hiện khi bạn đang ở trong mã tốn kém tính toán của bạn sẽ không bị lặp lại với màn hình. Nó vẫn được nhập vào bộ đệm của STDIN mặc dù vậy, vì vậy ...
  • ReadMode 3 biến STDIN thành chế độ cbreak, có nghĩa là STDIN loại bị xóa sau mỗi lần nhấn phím. Đó là lý do tại sao ...
  • while(defined($key = ReadKey(-1))) {} xảy ra. Điều này là xóa bỏ các ký tự mà người dùng đã nhập trong mã tính toán đắt tiền. Sau đó ...
  • ReadMode 0 đặt lại STDIN và bạn có thể đọc từ STDIN như thể người dùng không chạm vào bàn phím.

Khi tôi chạy mã này và gõ trên bàn phím trong sleep(10), sau đó nhập một số văn bản khác sau dấu nhắc, nó chỉ in ra văn bản mà tôi đã nhập sau khi lời nhắc xuất hiện.

Nói đúng cách ReadMode 2 là không cần thiết, nhưng tôi đặt nó ở đó để màn hình không bị lộn xộn với văn bản khi người dùng đập trên bàn phím.

+3

Một số giải thích sẽ tốt đẹp. – TLP

+0

Giải thích Đã thêm. – ZnArK

+0

Câu trả lời này (mã và giải thích) được sao chép chính xác từ "Câu trả lời gốc" ngoại trừ trích dẫn giới thiệu và chỉnh sửa/liên kết. Có lẽ thay vì câu trả lời hai chiều, chúng ta nên đóng câu hỏi như một sự lừa đảo? – pilcrow

Các vấn đề liên quan