我尝试在解析日志文件时找到在命令行上打印进度条的方法。获取logfiles => foreach file => foreach line {do}。
这个想法:我想在每个“foreach文件”循环中打印一部分进度条。 Meaing:如果只解析1个文件,则打印整个栏。当你解析2个文件时,打印每个文件的一半栏,依此类推。您可以在底部找到特定代码。
问题:输出(打印“*”)在所有foreach迭代完成后打印 - 而不是介于两者之间。细节在守则中。
有人知道如何在foreach中打印吗?或者可以告诉我这个问题?我不明白:(。
my @logfiles=glob($logpath);
print "<------------------>\n";
$vari=20/(scalar @logfiles);
foreach my $logfile (@logfiles){
open(LOGFILEhandle, $logfile);
@lines = <LOGFILEhandle>;
print "*" x $vari; #won't work, only after loop. Even a "print "*";" doesn't work
foreach my $line (@lines){
#print "*"; works "in between". print "*" x $vari; does not.
if ($line=~/xyz/){
......
......
}
close(LOGFILEhandle);
}
}
答案 0 :(得分:4)
我想建议Term::ProgressBar模块,以避免重新发明轮子。
#!/usr/bin/perl
use strict;
use warnings;
use Term::ProgressBar;
my @files = qw (file1 file2 file3 file4);
my $progress = Term::ProgressBar->new(scalar @files);
for (0..@files) {
$| = 1;
sleep(1); #introducing sleep for demo purpose otherwise bar will fill up quickly
#open the file, do some operations and when you are done
#update the bar
$progress->update($_);
}
答案 1 :(得分:3)
你正在遭受缓冲。缓冲输出直到达到一定量或打印换行符。要更改此行为,只需添加
$| = 1 ;
位于文件顶部。这将为STDOUT
启用autoflush。
有多种方法可以做到这一点,而且更长一点也不那么神秘的是鲍罗丁的建议:
STDOUT->autoflush();