...but you'd better make sure that you're actually writing to a terminal:
#!/usr/bin/perl use strict; my $in = shift || '/usr/share/dict/words'; my $running_on_terminal = -t STDOUT; my $last_word_length; open IN, $in or die "Cannot open $in for input: $!\n"; while( <IN> ) { chomp; if ($running_on_terminal) { my $length_diff = $last_word_length - length($_); $length_diff >= 0 or $length_diff = 0; print ("\rProcessing $_..." . (" " x $length_diff) . ("\b" x $length_diff)); $last_word_length = length($_); } # do something with $_ } print "\n" if ($running_on_terminal); close IN;
caveat: this code still assumes the user's terminal is wide enough for any line we're going to print.
You might want to wrap it up into a module or object, so you can go:
my $pm = new ProgressMeter(-items => scalar @list); $pm->start; my $c; for my $item (@list) { $pm->update(++$c); } $pm->finish;
I wrote something like that once, but unfortunately it is owned by the company I wrote it for :-(
In reply to Re: Re: Writing to same line in STDOUT
by mugwumpjism
in thread Writing to same line in STDOUT
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |