use Time::HiRes qw(usleep); my $PROMPT="What's the ticket number?\n"; my $TRY_AGAIN_PROMPT="excuse me?\n"; my $TICKET_NUMBER=prompt_until($PROMPT, $TRY_AGAIN_PROMPT, '^\d{7}$|^NOTICKET$', 1500); sub prompt_until { my $prompt_text=$_[0]; my $try_again_prompt=($_[1])? $_[1] : ''; my $until_regex=($_[2])? $_[2] : '.*'; my $speed=($_[3])? $_[3] : '0'; my $answer; if ($speed) { print_slow($prompt_text,$speed); } else { print "$prompt_text"; } $answer=; until ($answer=~m/$until_regex/) { if ($speed) { print_slow($try_again_prompt,$speed); } else { print "$try_again_prompt"; } $answer=; } chomp $answer; return $answer; } ################################################################################ sub print_slow { my $speed=pop(@_); my $phrase=join('',@_); my @characters=split(//,$phrase); foreach my $char (@characters) { print $char; usleep($speed); } } ################################################################################