in reply to y/n input in a captive interface

None of the answers so far seem to be to your liking. Sounds like a "wash but don't wet" challenge.

The problem you have is the line discipline of the terminal. To read a single char from it, you must set it into cbreak mode.

With the perl core, you can do that only with POSIX. With system utilities, use stty (afaik there's no UNIX or UNIX like or Linux out there which doesn't have that basic utility). After having set your terminal with either method, it's just sysread:

#!/usr/bin/perl system 'stty','cbreak' and die; sysread STDIN,$a,1,0; print "\n",$a =~ /y/ ? "yup\n" : "nope\n"; system 'stty','-cbreak' and die;
For the same with POSIX see johngg's answer. POSIX::Termios is in $Config::Config{installarchlib}/auto/POSIX.so, so it is available with every *nix perl.

--shmem

_($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                              /\_¯/(q    /
----------------------------  \__(m.====·.(_("always off the crowd"))."·
");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}

Replies are listed 'Best First'.
Re^2: y/n input in a captive interface
by apotheon (Deacon) on Feb 08, 2007 at 17:56 UTC

    Does POSIX work for, say, Windows and Plan 9, too? I'm not too worried about BeOS, I guess. I'm asking because I honestly don't know.

    print substr("Just another Perl hacker", 0, -2);
    - apotheon
    CopyWrite Chad Perrin

      No - at least not within ActiveState Perl:
      POSIX::termios not implemented on this architecture at C:/Perl/site/li +b/RawTerm. pm line 15. BEGIN failed--compilation aborted at C:/Perl/site/lib/RawTerm.pm line +43.

      --shmem

      _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                    /\_¯/(q    /
      ----------------------------  \__(m.====·.(_("always off the crowd"))."·
      ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}