shisgmei 发表于 2018-8-31 10:13:42

Perl程序中显示进度条之多姿多彩的自写代码

#!/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";
  
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 );
  
}


页: [1]
查看完整版本: Perl程序中显示进度条之多姿多彩的自写代码