|
#!/usr/bin/perl -w
# Author: Zhao
# Date: 2009.12.22
# Purpose: simulate the progress bar
# Update: 2009.12.23
# add color output
# Update: 2010.5.22
# calculate remaining time
$n = 1000;
for ( $i = 1 ; $i 《= $n ; $i++ ) {
proc_bar( $i, $n );
select( undef, undef, undef, 0.01 );
}
print "\n";
sub proc_bar {
local $| = 1;
my ( $i, $n ) = @_;
my $rt = '';
my ( $num, $a, $b, @k, @v );
if ( $i % 50 == 1 ) { $ts_global{$i} = time; }
$num = scalar keys %ts_global;
if ( $num 》= 5 ) {
delete $ts_global{ $i - 250 };
@k = keys %ts_global;
@v = values %ts_global;
( $b, $a ) = best_line( \@k, \@v );
$rt = int( $b * $n + $a - time + 1 ) . "s ";
}
print "\r33[36m[33[33m"
. ( "#" x int( ( $i / $n ) * 50 ) )
. ( " " x ( 50 - int( ( $i / $n ) * 50 ) ) )
. "33[36m]";
printf( "%2.1f%%33[0m", $i / $n * 100 );
print " $rt";
}
sub best_line {
my ( $array1ref, $array2ref ) = @_;
my ( $i, $product, $sum1, $sum2, $sum1_squares, $a, $b );
for ( $i = 0 ; $i 《 @$array1ref ; $i++ ) {
$product += $array1ref-》[$i] * $array2ref-》[$i];
$sum1 += $array1ref-》[$i];
$sum1_squares += $array1ref-》[$i]**2;
$sum2 += $array2ref-》[$i];
}
$b =
( ( @$array1ref * $product ) - ( $sum1 * $sum2 ) ) /
( ( @$array1ref * $sum1_squares ) - ( $sum1**2 ) );
$a = ( $sum2 - $b * $sum1 ) / @$array1ref;
return ( $b, $a );
}
|
|
|