How can I print text immediately without waiting for a newline in Perl?

后端 未结 5 2230
长发绾君心
长发绾君心 2021-02-19 07:43

I have a computationally expensive task in perl, and would like to inform the user that computation is ongoing by printing out a period after each portion of the computation is

相关标签:
5条回答
  • 2021-02-19 07:50

    You need to set autoflush for STDOUT. Example:

    use IO::Handle;
    STDOUT->autoflush(1);
    foreach (1..20) {
      print '.';
      sleep(1);
    }
    
    0 讨论(0)
  • 2021-02-19 07:55

    See the FAQ How do I flush/unbuffer an output filehandle? Why must I do this? and note:

    Besides the $| special variable, you can use binmode to give your filehandle a :unix layer, which is unbuffered ...

    For the general problem, you might want to look at Time::Progress:

    %b

    %B

    progress bar which looks like:

    ##############......................
    
    0 讨论(0)
  • 2021-02-19 08:03

    An excellent article you should read: Suffering from Buffering?

    0 讨论(0)
  • 2021-02-19 08:06

    What worked for me was to put the line

    STDOUT->autoflush(1);
    

    before my line

    print ".";
    

    inside my existing loop. Didn't use the sleep for fear of slowing the things down even more.

    0 讨论(0)
  • 2021-02-19 08:10

    set $|=1 before you start printing. Eg.

    perl -e ' $|=1; foreach (1..10) { print "$_ "; sleep(1); }'
    
    0 讨论(0)
提交回复
热议问题