gpt4 book ai didi

perl - 解析行时将输入记录分隔符更改为\n 或\r

转载 作者:行者123 更新时间:2023-12-01 22:58:09 26 4
gpt4 key购买 nike

我有一个 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\r 作为输入记录分隔符。

有什么想法吗?

最佳答案

有四种读取文件的方法:

  • 一次一个字符:getc
  • 一次一行:readline with $/= $terminator;
  • 一次一个 block :readreadline 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);
}
'

关于perl - 解析行时将输入记录分隔符更改为\n 或\r,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22156483/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com