繁体   English   中英

迭代进入foreach循环时打印不起作用

[英]print doesn't work while iterations are going inside foreach loop

我试图在解析日志文件时找到一种在命令行上打印进度条的方法。 获取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);
    }
}

我想建议使用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 ;

在您的文件的顶部。 这将打开STDOUT autoflush。 有多种方法可以做到这一点,而且更长一点也不那么神秘的是鲍罗丁的建议:

STDOUT->autoflush();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM