我有一个 perl 脚本,它读取从另一个进程传输的输出(逐行),进行一些处理并输出其结果:
#!/bin/bash
set -e
set -o pipefail
RUN.SH ${@} 2>&1 | perl -M"Term::ANSIColor" -wnl -e '
m/ERROR/i and print "\e[1;91m", "$_", "\e[0m"
or print;'
而且效果很好,除非过程的输出RUN.SH
不以新行结束(\n
)并以\r
反而!在这种情况下,这个 Perl 解析器不会打印任何内容,直到下一个\n
。我需要更改它,以便它可以同时使用\n
and \r
作为输入记录分隔符。
有什么想法吗?
读取文件的方法有四种:
- 一次一个字符:
getc
- 一次一行:
readline
with $/ = $terminator;
- 一次一个块:
read
and readline
with $/ = \$length;
- 当数据到达时:
sysread
getc
会起作用,但我会使用更有效的sysread
.
perl -we'
sub make_iter {
my ($fh) = @_;
my $buf = "";
my $eof = 0;
return sub {
return if $eof;
while (1) {
return $1 if $buf =~ s/^([^\r\n]*[\r\n])//;
my $rv = sysread(STDIN, $buf, 64*1024, length($buf));
if (!$rv) {
$eof = 1;
die $! if !defined($rv);
return $buf if length($buf);
return;
}
}
};
}
binmode(STDIN);
binmode(STDOUT);
$| = 1;
my $iter = make_iter(\*STDIN);
while (my ($line) = $iter->()) {
$line = "\e[1;91m" . $line . "\e[0m" if $line =~ /ERROR/i;
print($line);
}
'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)