Мне очень нравятся Time :: Progress для терминала.Упрощенный пример -
use warnings;
use strict;
use Time::Progress;
use Time::HiRes "usleep"; # for demo.
my $timer = Time::Progress->new();
my $some_total_to_reach = 10_000;
$timer->attr( min => 1, max => $some_total_to_reach );
my $count = 1;
while ( $some_total_to_reach-- )
{
print $timer->report("Doing stuff: %40b%p%L%E\r", $count++);
usleep int(rand(1_000));
}
print "\nDone!\n";