#!/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 :-( |