nattimonk has asked for the wisdom of the Perl Monks concerning the following question:

Hello, I am trying to update my stdout in a clock like fashion. foreg, if I write a counter, counting from 0..5 it would usually print as 0 1 2 3 4 5 What I am looking at is for 0 to go away and 1 appearing it its place and then 2 and so on. How can I do the same for a line of text. I have seen this happen in the command line while installing some software. Would like to add that feature to my code too. Hope this is clear. Regards,

Replies are listed 'Best First'.
Re: updating stdout
by roboticus (Chancellor) on Feb 17, 2007 at 13:48 UTC
    nattimonk:

    In general, to display status on long-running operations, I use something like this:

    print " \r", $status; I often put extra blanks at the beginning when my status value isn't necessarily going to always be the same length or longer for each successive value. That way extra characters from a previous status value doesn't hang around.

    However, in order to get the output to work the way you intend, you also need to ensure that the value is written immediately, otherwise your status lines may seem to hang or display in "bursts". So I also turn on automatic flushing on the output file handle. So here's a trivial example:

    #!/usr/bin/perl use warnings; use strict; $|=1; # Turn on automatic flushing on stdout for (0..1000) { my $status = substr(rand,0,5); print " \r", $status; sleep 5; }
    --roboticus
      Yes, dont't forget the flushing! :)

      But if you want to avoid extra blanks, I recommend printf and perhaps to "cut" your output. Like
      printf( "%-60s\r", substr $line, -60 );

      k
Re: updating stdout
by johngg (Canon) on Feb 17, 2007 at 19:12 UTC
Re: updating stdout
by Anonymous Monk on Feb 17, 2007 at 13:05 UTC
    \r