Perl中显示滚动进度条

非常怀念DOS时代在程序中显示进度的方法,当时觉得那些程序非常酷(记得是JAR,一个压缩程序,进度在原地显示,有百分比),因为倾我所学,也不知道如何实现。在PERL代码中,我一直使用的就是滚屏显示进度。今天看有人跟老大吵架的贴,找到了灵感,贴出来跟大家共享一下。

1、方法1
my $max = 100;
for(1..$max) {
        my $percent = $_/$max*100;
        print "$_ - $percent % OK!\n";
        sleep(1);
}
<STDIN>;
复制代码
这是我最常用的方法,在处理大量数据时,我从屏幕上能看到进度,虽然它会消耗一些额外的时间。这种方法简单,稳定,而且容易实现,随意使用。

2、方法2
#!/usr/bin/perl -w

$| = 1;
my $max = 10;
for(1..$max) {
        print ".";
    print " Complete!" if ($_ == $max);
        sleep(1);
}
<STDIN>;
复制代码
这也是DOS时代非常经典的进度指示,从“…..”的长度来判断进度。

3、方法3
#!/usr/bin/perl -w

local $| = 1;
my @progress_symbol = ('-','\\','|','/');
my $n = 0;
for(my $i=1;$i<=3000;$i++){
        print "\r $progress_symbol[$n] $i";
         $n = ($n>=3)? 0:$n+1;
        select(undef, undef, undef, 0.1);
}
local $| = 0;

<STDIN>;
复制代码
用滚轮在原地显示进度,当然也可以加入百分比,这是我一直认为非常酷的方法,以后会加入自己的程序。

4、方法4
#!/usr/bin/perl -w

local $| = 1;
while (1){
        &gettime;
        print "\r $now";
        sleep(1);
}
local $| = 0;
exit;

sub gettime {
        my ($sec,$min,$hour,$day,$mon,$year,$weekday,$yeardate,$savinglightday) = (localtime(time));
        $sec = ($sec < 10)? "0$sec":$sec;
        $min = ($min < 10)? "0$min":$min;
        $hour = ($hour < 10)? "0$hour":$hour;
        $day = ($day < 10)? "0$day":$day;
        $mon = ($mon < 9)? "0".($mon+1):($mon+1);
        $year += 1900;
        $now = "$year.$mon.$day $hour:$min:$sec";
}
复制代码
在原地显示走时的数字时钟,可以加入百分比,也很酷。

5、方法5
#!/usr/bin/perl -w
# Author: Zhao
# Date: 2009.12.22
# Purpose: simulate the progress bar

$n = 30;
for($i=1;$i<=$n;$i++){
        proc_bar($i,$n);
        select(undef, undef, undef, 0.2);
}
<STDIN>;

sub proc_bar{
        local $| = 1;
        my $i = $_[0] || return 0;
        my $n = $_[1] || return 0;
        print   "\r [ ".("\032" x int(($i/$n)*50)).(" " x (50 - int(($i/$n)*50)))." ] ";
        printf("%2.1f %%",$i/$n*100);
        local $| = 0;
}
复制代码
从吵架贴里看到的,在我看来比较高级的方法,有百分比,有不断增长的进度条。

另有一个叫Term:rogressBar,也很好,但我的程序没有那么复杂,有兴趣的可以研究一下。CPAN上还有一些其他显示进度的模块。

$|变量的作用:
$|变量设置为真时,每输出一次,STDOUT缓冲会被强制清空


以上是自己摸索出的小方法,希望对大家有帮助,若有其他方法,请贴出来共享。


转载于:https://my.oschina.net/OliverTwist/blog/265272

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值