in reply to Re: Regex arrow key problem
in thread Regex arrow key problem

So there's no way to use \x52 or whatever the hex code is for the arrow keys?

Replies are listed 'Best First'.
Re^3: Regex arrow key problem
by BrowserUk (Patriarch) on Dec 01, 2010 at 19:36 UTC
    So there's no way to use \x52 or whatever the hex code is for the arrow keys?

    Not that I'm aware of.


    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
      Bummer. There's a way to do it for seemingly every other key, but when I try a hex code on arrow keys, it won't work. I looked at this page: http://api.farmanager.com/en/winapi/virtualkeycodes.html It shows all of the hex codes for keys, and http://perldoc.perl.org/perlre.html says I can use \x followed by the 2 hex digits to capture a key. Left arrow would be \x25, and right arrow \x27, but I'm not sure why that doesn't work.
        but I'm not sure why that doesn't work.

        Because ReadKey "converts" inbound keycodes to VT100/termcap-compatible control sequences for 'portability' sake.

        The full decision tree required to decode these sequences--at least those emulated on a win32 system--is:

        #! perl -slw use strict; use Term::ReadKey; ReadMode( 4 ); while( 1 ) { my $c = ReadKey( 0 ); if( $c eq "\e" ) { # got an escape if( $c = ReadKey(-1) ) { ## If its an extended key they'll be another character in +the buffer if( $c eq '[' ) { # Could be an extended key, the next character to dete +rmine which $c = ReadKey( -1 ); if( $c eq "A" ) { print "Got uparrow"; } elsif( $c eq "B" ) { print "Got downarrow"; } elsif( $c eq "C" ) { print "Got rightarrow"; } elsif( $c eq "D" ) { print "Got leftarrow"; } elsif( $c eq "2" ) { print "Got Insert"; $c = ReadKey( 0 ); ## Discard (useless) '~' } elsif( $c eq "3" ) { print "Got Delete"; $c = ReadKey( 0 ); ## Discard (useless) '~' } elsif( $c eq "1" ) { print "Got Home"; $c = ReadKey( 0 ); ## Discard (useless) '~' } elsif( $c eq "4" ) { print "Got End"; $c = ReadKey( 0 ); ## Discard (useless) '~' } else { print "Ignoring unknown extended key: '$c;"; next; } } elsif( $c eq "O" ) { ## Another set of extnded keys $c = ReadKey( -1 ); if( $c eq 'y' ) { print "Got PageUp"; } elsif( $c eq 's' ) { print "Got PageDown"; } else { print "Ignoring unknown extended key: '$c;"; next; } } else { print "Ignoring unknown extended sub-selector '$c'"; next; } } else { # Just a simple escape, so quit print "Got Escape; exiting"; last; } } elsif( $c eq chr(0) ) { print "Got a null"; } else { print "Got '$c' ", ord( $c ); } } ReadMode( 0 );

        But note: that doesn't allow any access to the function keys; or ctrl/alt/shift combinations with the arrow and other navigation keys. It's really a rather useless module in that respect.

        If you are using Windows, then the more useful module for keyboard (and mouse) handling is Win32::Console::Input(), which allows you access to all of the Windows defined virtual keycodes + the actual scancodes; but it is still quite a messy affair and totally non-portable,


        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.
Re^3: Regex arrow key problem
by ikegami (Patriarch) on Dec 01, 2010 at 19:45 UTC
    Character 0x52 is uppercase letter "R".
      I know, I was just using an example. 0x25 is left arrow and 0x27 is right, but it won't work when I put it in as
      if ($input =~ m/\x25/)
        0x25 is the percent sign, 0x27 is the apostrophe. What are you talking about?