perl的进度线

fsi*_*vic 1 perl

我想为我的脚本创建一个非常简单的进度条.到目前为止,我已经有了这个,它的确有效.但是,我无法让它成为100的百分比.我的代码如下,它基本上为每5个条目生成一个点@entries.

my $total_entries = @entries; 
my $count = 0; 
my $count_tens = $total_entries/0.2;            
$count_tens = sprintf ('%d',$count_tens);

foreach (@entries){

    # do some stuff #

    for (1 .. $total_entries){              
        if ($count == $count_tens){
            print ".";
            $count = 0;
        }   
    $count++;
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望有一些产生总是固定数量的点的东西,无论在哪个条目总数@entries.

amo*_*mon 5

假设我们想要80个点.然后:

my $number_of_dots = 80;
my @items = 0 .. 20; # or something
my $items_per_dot = @items / $number_of_dots;

STDOUT->autoflush(1);  # print everything out immediately

for my $i (0 .. $#items) {
    my $dots = $i / $items_per_dot;
    print "\r", "." x $dots;
    sleep 1; # do something
}
print "\n";
Run Code Online (Sandbox Code Playgroud)

请注意,我们通过在每次迭代时重新计算每个项目的点数来避免舍入误差.在\r将光标移动到该行的开始,所以在现有的点将每次被覆盖.如果$dots迭代之间的值没有变化,您可以轻松跳过打印.