howto capture a keystroke
jeanluca
created: 2006-03-06 03:52:45
Dear Monks

I would like to be able to capture keystrokes inside my perlscript (In this particular case any keystroke will terminate an endless loop)

Where can I read about this stuff ?

Thanks a lot
Luca
Re: howto capture a keystroke
created: 2006-03-06 04:04:47
I think the example in the synopsis of Term::Readkey is what you are looking for.
Re^2: howto capture a keystroke
created: 2006-03-06 04:54:54
Yep, thnx
Re: howto capture a keystroke
created: 2006-03-06 06:44:48
Just for sake of TMTOWTDI, you can also have a look at the -1 / -one_char option of IO::Prompt. But it's probably only Term::ReadKey ;)

Flavio
perl -ple'$_=reverse' << Don't fool yourself.

Re: howto capture a keystroke
created: 2006-03-06 11:59:33
If you're on a Linux system and want to "roll your own", you might consider creating a subroutine to enter "raw" terminal mode, as in the following example.  The subroutine one_key creates a closure which, each time it's called, gets the next character, but without blocking.  When you're done, you can call the closure a final time with a zero argument to reset "cooked" mode (normal terminal).
#!/usr/bin/perl -w
#
#  Example of getting a single, non-blocking character in Linux.
#
#  060306 liverpole
#

# Strict
use strict;
use warnings;

# Subroutine for capturing a key
sub one_key {
    chomp(my $stty = `stty -g`);                # Save 'cooked' mode tty
    `stty -icrnl -icanon -echo min 0 time 0`;   # Begin raw mode
    sub {                                       # Create a closure
        if (!$_[0]) {                           # If argument is zero ...
            system("stty $stty");               #   restore 'cooked' mode
        } else {                                # Otherwise get and return
            `dd bs=1 count=1 <&0 2>/dev/null`;  #   a single keystroke
        }
    };
}


# Main program
my $p_one_key = one_key();
while (1) {
    print ' ' x int(rand(20)), "*\n";
    select(undef, undef, undef, 0.1);
    last if $p_one_key->(1);
}
$p_one_key->(0);

@ARGV=split//,"/:L"; map{print substr crypt($_,ord pop),2,3}qw"PerlyouC READPIPE provides"

perlmonks.org content © perlmonks.org and frodo72, jeanluca, liverpole, matze

prlmnks.org © 2006 edmund von der burg (eccles & toad)

v 0.03