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
You need to set autoflush for STDOUT. Example:
use IO::Handle;
STDOUT->autoflush(1);
foreach (1..20) {
print '.';
sleep(1);
}
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:
##############......................
An excellent article you should read: Suffering from Buffering?
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.
set $|=1
before you start printing. Eg.
perl -e ' $|=1; foreach (1..10) { print "$_ "; sleep(1); }'