当迭代进入 foreach 循环时打印不起作用
print doesn't work while iterations are going inside foreach loop
我试图找到一种在解析日志文件时在命令行上打印进度条的方法。获取日志文件=> foreach 文件=> foreach 行{do}。
想法:我想在每个 "foreach file" 循环中打印进度条的一部分。含义:如果您只解析 1 个文件,则打印整个条形图。当您解析 2 个文件等时,为每个文件打印一半的条形图。你在底部找到具体的代码。
问题:输出 (print "*") 是在所有 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);
}
}
您遇到缓冲问题。输出会被缓冲,直到达到一定数量或打印换行符。要更改此行为,只需添加
$| = 1 ;
在文件的顶部。这将为 STDOUT
打开自动刷新。
有不止一种方法可以做到这一点,Borodins 的建议是更长一点、更不那么神秘:
STDOUT->autoflush();
我想推荐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($_);
}
我试图找到一种在解析日志文件时在命令行上打印进度条的方法。获取日志文件=> foreach 文件=> foreach 行{do}。
想法:我想在每个 "foreach file" 循环中打印进度条的一部分。含义:如果您只解析 1 个文件,则打印整个条形图。当您解析 2 个文件等时,为每个文件打印一半的条形图。你在底部找到具体的代码。
问题:输出 (print "*") 是在所有 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);
}
}
您遇到缓冲问题。输出会被缓冲,直到达到一定数量或打印换行符。要更改此行为,只需添加
$| = 1 ;
在文件的顶部。这将为 STDOUT
打开自动刷新。
有不止一种方法可以做到这一点,Borodins 的建议是更长一点、更不那么神秘:
STDOUT->autoflush();
我想推荐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($_);
}