solaris perl print不输出_终端进度条的实现方法[perl实现]

实现终端进度条主要是依靠 r符能将光标移动到行首的能力,下面我们来一步一步的来实现一个终端进度条.

下面的 perl 脚本不出意外会输出 Hello World

#!/usr/bin/perl
use strict;
use warnings;

print "Hello World";

现在用 r将光标设置到行首

#!/usr/bin/perl
use strict;
use warnings;

print "Hello Worldr";

很多的终端都是带有缓冲,遇到n才会输出内容,所以这里我们需要强制刷新缓冲区域

#!/usr/bin/perl
use strict;
use warnings;

use IO::Handle;


print "Hello World";
STDOUT->flush();
sleep 1;
print "r";
STDOUT->flush();
sleep 1;

可以看到屏幕输出了 Hello World,过了一秒钟以后,光标移动到行首了. 下面我们用 #来充当进度条的内容

#!/usr/bin/perl
use strict;
use warnings;

use IO::Handle;
my $content;
for(my $i = 1; $i < 101; $i++) {
    $content =  "#" x $i ;
    print $content . $i . "%";
    STDOUT->flush();
    sleep 1;
    print "r";
    STDOUT->flush();

0c70f5fb65f8fdeb59b5d5ead112a65a.gif

这样看起来就很像一个真的进度条了,每秒上涨 1%,当然,这里还有一点问题,进度条只能正向上涨,不能下降.还需要简单修改一下,每次需要清理当前行

#!/usr/bin/perl
use strict;
use warnings;

use IO::Handle;

my $max_len = 0;
sub render($) {
    if($_[0] > $max_len) {
        # 加上后面的两个数字和百分号
        $max_len = $_[0] + 3;
    }
    clean();
    my $content =  "#" x $_[0];
    print $content . $_[0] . "%";
    STDOUT->flush();
}
sub clean() {
    my $str = sprintf "r%sr", " " x $max_len;
    print $str;
    STDOUT->flush();
}

while(1) {
    my $progress = int(rand(100));
    render($progress);
    sleep 1;
}

这样执行就非常像一个正确的进度条了

010bf2a602a8f3cdee1f89af788468a7.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值