#!/usr/bin/perl use strict; # https://perlmonks.org/?node_id=11141714 use warnings; use Term::ReadKey; use Time::HiRes qw( time ); use List::Util qw( max ); $| = 1; my $n = my @menuitems = qw( one two three four ); my ($w, $h) = GetTerminalSize; my $interval = 10; my $due = time + $interval; my $result = eval { ReadMode 'cbreak'; while( 1 ) { print "\e[H\e[J", "\n" x ($h - @menuitems - 5), "enter number for choice:\n\n"; print "$_ : $menuitems[ $_ - 1 ]\n" for 1 .. @menuitems; print "\nnumber : "; my $delta = max 0.001, $due - time; local $_ = ReadKey $delta; if( not defined $_ ) { print("running occasional program every $interval seconds"); sleep 1; $due = time + $interval; } elsif( /[1-$n]/ ) { print("running $menuitems[$_ - 1]"); sleep 1; } elsif( /[qQ\e]/ ) { last; } else { print("bad key, try again"); sleep 1; } } } || $@; ReadMode 'restore'; print "$result\n";