Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 打印不';迭代在foreach循环中进行时不工作_Perl_Foreach_Perl Module_Progress_Buffering - Fatal编程技术网

Perl 打印不';迭代在foreach循环中进行时不工作

Perl 打印不';迭代在foreach循环中进行时不工作,perl,foreach,perl-module,progress,buffering,Perl,Foreach,Perl Module,Progress,Buffering,我试图找到一种在解析日志文件时在命令行上打印progressbar的方法。获取日志文件=>foreach文件=>foreach行{do} 想法:我想在每个“foreach file”循环中打印progressbar的一部分。meain:如果你只解析一个文件,就打印整个条。当你解析2个文件时,为每个文件打印一半条,以此类推。您可以在底部找到特定的代码 问题是:输出(print“*”)是在所有foreach迭代完成后打印的,而不是在两者之间。详情请参阅守则 有人知道如何在foreach中打印吗?或者

我试图找到一种在解析日志文件时在命令行上打印progressbar的方法。获取日志文件=>foreach文件=>foreach行{do}

想法:我想在每个“foreach file”循环中打印progressbar的一部分。meain:如果你只解析一个文件,就打印整个条。当你解析2个文件时,为每个文件打印一半条,以此类推。您可以在底部找到特定的代码

问题是:输出(print“*”)是在所有foreach迭代完成后打印的,而不是在两者之间。详情请参阅守则

有人知道如何在foreach中打印吗?或者你能告诉我这个问题吗?我不明白

my@logfiles=glob($logpath);
打印“\n”;
$vari=20/(标量@日志文件);
foreach my$logfile(@logfiles){
打开(LOGFILEhandle,$logfile);
@行=;
打印“*”x$vari;#仅在循环后无效。即使是“打印”*“;”也无效
foreach my$行(@行){
#打印“*”在这两者之间起作用。打印“*”x$vari;不起作用。
如果($line=~/xyz/){
......
......
}
关闭(LOGFILEhandle);
}
}

您正遭受缓冲。输出将被缓冲,直到达到一定数量或打印换行。要更改此行为,只需添加

$| = 1 ;
在文件顶部。这将为
STDOUT
启用自动刷新。 有不止一种方法可以做到这一点,博罗丁的建议更长一些,也不那么神秘:

STDOUT->autoflush();
我想建议模块避免重新发明轮子

#!/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($_);
}

尝试
print“*”x$vari,“\n”
或设置
$\124;=1
。也许你是。
STDOUT->autoflush
更容易解释,可以在任何给定的文件句柄上使用。“遭受缓冲”听起来像是一个常见问题:)。5个字符使它工作。谢谢@是的,你是对的。。。我把你的建议加到了答案上。
#!/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($_);
}