use Term::ReadKey; sub Request { my ($prompt, $letters, $linefeed) = @_; return unless $prompt; $letters ||= "Ny"; $linefeed ||= 1; my ($answer, $is_correct); do { print "$prompt? [$letters] "; ReadMode 'cbreak'; $answer = uc ReadKey 0; ReadMode 'normal'; $is_correct = (index uc $letters, $answer >= 0); print "\nplease answer [$letters]\n" unless $is_correct; } until $is_correct; print "\n" if $linefeed; return $answer; }