Flushing Perl STDIN buffer

前端 未结 3 684
既然无缘
既然无缘 2021-01-04 19:10

Is there any way to clear the STDIN buffer in Perl? A part of my program has lengthy output (enough time for someone to enter a few characters) and after that output I ask f

3条回答
  •  梦毁少年i
    2021-01-04 19:49

    It looks like you can accomplish this with the Term::ReadKey module:

    #!perl
    
    use strict;
    use warnings;
    use 5.010;
    
    use Term::ReadKey;
    
    say "I'm starting to sleep...";
    ReadMode 2;
    sleep(10);
    ReadMode 3;
    my $key;
    while( defined( $key = ReadKey(-1) ) ) {}
    ReadMode 0;
    say "Enter something:";
    chomp( my $input =  );
    say "You entered '$input'";
    

    Here's what happens:

    • ReadMode 2 means "put the input mode into regular mode but turn off echo". This means that any keyboard banging that the user does while you're in your computationally-expensive code won't get echoed to the screen. It still gets entered into STDIN's buffer though, so...
    • ReadMode 3 turns STDIN into cbreak mode, meaning STDIN kind of gets flushed after every keypress. That's why...
    • while(defined($key = ReadKey(-1))) {} happens. This is flushing out the characters that the user entered during the computationally-expensive code. Then...
    • ReadMode 0 resets STDIN, and you can read from STDIN as if the user hadn't banged on the keyboard.

    When I run this code and bang on the keyboard during the sleep(10), then enter some other text after the prompt, it only prints out the text I typed after the prompt appeared.

    Strictly speaking the ReadMode 2 isn't needed, but I put it there so the screen doesn't get cluttered up with text when the user bangs on the keyboard.

提交回复
热议问题