Warning: you need to set the readmode back to normal before exiting. So don't just exit on 'q' - do something to get the terminal back into its regular state.
sub safe_exit {
ReadMode('normal');
exit(@_);
}
# ...
safe_exit if $key eq 'q';
# ...
| [reply] [Watch: Dir/Any] [d/l] |
To be extra sure the terminal is in a sane state after the program exits, the safe_exit routine could be hooked in some other places, too, e.g.
$SIG{'INT'} = \&safe_exit;
$SIG{'QUIT'} = \&safe_exit;
$SIG{__DIE__} = \&safe_exit;
END { safe_exit(); }
--- Update: oops, references added, as benizi pointed out below | [reply] [Watch: Dir/Any] [d/l] [select] |
use Term::ReadKey;
{
my $called = 0;
sub safe_exit {
print "safe_exit called $called times before\n";
return if $called++;
# disconnect from DB, etc. (things that should only be done on
+ce)
ReadMode 'normal';
print "Exiting safely\n";
print "exit(@_)\n" if @_;
exit @_;
}
}
$SIG{$_} = \&safe_exit for qw/INT QUIT __DIE__/;
END { safe_exit(); }
ReadMode 'cbreak';
print "Entering loop. Try: kill -INT $$, to see that I exit safely.\nH
+it 'x' to see me die.\n";
while (1) {
next unless defined(my $key = ReadKey);
print "In the loop, got: $key\n";
last if $key eq 'q';
die "with this error message" if $key eq 'x';
}
| [reply] [Watch: Dir/Any] [d/l] |