Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Re: Capture a non-printable char and test what it is

by haukex (Archbishop)
on May 21, 2022 at 15:27 UTC ( [id://11144045]=note: print w/replies, xml ) Need Help??


in reply to Capture a non-printable char and test what it is

Can anyone tell me how I would capture a non-printable character from STDIN and test what the character is? Specifically, I want to test if the escape key has been pressed.

See Term::ReadKey:

use warnings; use strict; use Term::ReadKey qw/ReadMode ReadKey/; use Data::Dumper; $Data::Dumper::Useqq=1; print "Press a key\n"; ReadMode 'cbreak'; my $key = ReadKey(0); ReadMode 'restore'; print Dumper($key); if ( $key eq "\e" ) { print "Escape pressed\n"; }
Trying to build a console based text editor.

Beware of reinventing the wheel, but anyway, see Curses and perhaps Curses::UI (though the latter is pretty old by now).

Replies are listed 'Best First'.
Re^2: Capture a non-printable char and test what it is
by almsdealer (Acolyte) on May 21, 2022 at 22:02 UTC

    How does \e represent the escape key? Where do you find that?

    If I look at the ascii table I see that the escape key can be represented as: 27 (decimal), 1B (hexadecimal), 033 (octal). But I am not sure how to test whether the value returned from ReadKey is one of those.

      Where do you find that?

      kcott is right that I simply looked at the code's output, but it's also documented in Quote and Quote like Operators.

      If I look at the ascii table I see that the escape key can be represented as: 27 (decimal), 1B (hexadecimal), 033 (octal).

      Those work too: the string "\e" is the same as "\x1B" and "\033" - you can try this out yourself with eq.

        Thank you, that link to quote-like characters is very useful. I think one mistake I made was trying to test if the char was the hex value of the escape key using single quotes.

      "How does \e represent the escape key? Where do you find that?"

      If you'd bothered to run the short piece of code ++haukex provided, and pressed the escape key, you would have seen:

      Press a key $VAR1 = "\e"; Escape pressed

      Had you pressed the enter key:

      Press a key $VAR1 = "\n";

      I suggest you also read ++haj's post for additional information and alternative methods to use.

      — Ken

        Yes, my mistake. I see that now.

      If I look at the ascii table

      then you only see a part of the non-printable characters available on modern computer systems. Unicode has more control characters, emoji skin tone modifiers, right-to-left mark and a host of other stuff that is unprintable on it's own.

      As an additional bonus, the same character on screen can sometimes be encoded in Unicode in multiple ways, see Unicode equivalence.

      Unfortunately, input processing has gotten a tad more complex since the world gave up on ye olde ASCII table. On the bright side, these days more than the 20% of world population of the old ASCII days can now type their name into a computer with a reasonable expectation that it will be processed correctly.

      perl -e 'use Crypt::Digest::SHA256 qw[sha256_hex]; print substr(sha256_hex("the Answer To Life, The Universe And Everything"), 6, 2), "\n";'

        I generally agree with everything you've written there; however, as a minor nitpick, those skin tone modifiers can be printed in isolation. I'm not sure how this will render on different browsers, but on my terminal:

        $ perl -C -E '
            say for
                "\N{U+1F3FB}",
                "\N{U+1F3FC}",
                "\N{U+1F3FD}",
                "\N{U+1F3FE}",
                "\N{U+1F3FF}"
        '
        🏻
        🏼
        🏽
        🏾
        🏿
        

        And, in a preview, that looks fine on my Firefox v100.0.2 — YMMV.

        — Ken

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11144045]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others rifling through the Monastery: (3)
As of 2024-04-24 22:07 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found