I apologize for the partial, unrunnable code in my post; I shouldn't post when sleep-deprived and frustrated. If I had taken the time to figure out a minimal script that reproduces the problem, I could have asked a much more specific question -- which I'll do now. The sample script provided by jethro worked fine on my system. I then tried to figure out what was the salient difference between his script and mine, and quickly remembered that my script was (because of the huge number of text files it might need to handle) reading a long list of filenames from stdin rather than the command line. It's normally run in a pipe from a find command, like so:
find $HOME -name \*.txt | textual-slideshow.pl $*
It slurps the filenames from standard input, then reads random sample paragraphs from some of them, prints random paragraphs a line at a time, and repeats. My simplified version that's partway between jethro's script and mine looks like this:
#! /usr/bin/perl use Term::ReadKey; use Time::HiRes qw(time); my @slurp_stdin = <>; ReadMode 3; while (1) { my $key; my $wait_until = time + 3; while ( time < $wait_until ) { $key = ReadKey( -1 ); if ( defined $key ) { print STDERR "keystroke $key\t"; } } print "Something\n"; }
And it has the same problem as my script, not surprisingly. The problem clearly has to do with running in an environment where stdin is redirected. So I tried to fix that by closing STDIN and reopening it after reading the filenames. That didn't help. I tried adding an explicit STDIN argument to the ReadMode and ReadKey calls; that didn't help either. This is what I've got now, and it also has the same problem as my original script or the above modification of jethro's script:
#! /usr/bin/perl -w use Term::ReadKey; use Time::HiRes qw(time); my @slurp_stdin = <STDIN>; close STDIN; open STDIN, "-"; while (1) { my $key; my $wait_until = time + 3; while ( time < $wait_until ) { ReadMode 3, STDIN; # 'noecho'; $key = ReadKey( -1, STDIN ); if ( defined $key ) { print STDERR "keystroke $key\t"; } ReadMode 0, STDIN; } print "Something\n"; }
This repeatedly prints "Something"; but when I press keys, I don't get the "keystroke (key value)" message, only the value of the key. My full original script is at http://jimhenry.conlang.org/scripts/textual-slideshow.zip.

In reply to Re^2: Problem with ReadKey by jimhenry
in thread Problem with ReadKey by jimhenry

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.