2

我正在扫描关键字“警告”的错误日志。当我找到它时,会出现一种特殊的警告情况,它将仅以换行符结束与警告相关的信息。我想要做的是扫描这个错误日志,找到关键字警告继续跳过文件,直到我只找到一个换行符,然后一旦我找到它,分析那个块并打印出来。

格式将是这样的:

Warning! blah
blah
blah
orange

Warning! blah
blah
red
blah

Warning!
blah
blah
blah
yellow

到目前为止,这是我的代码:使用严格;使用警告;

my $file = $ARGV[0];
my $count = 0;

open(LOG, "<",$file) or die "cannot open < input: $!"; 

my $line = <LOG>;
while($line ne "")
{
if($line =~ /warning/i)
{
    while($line !~/\A\n\z/)
    {
        if($line =~ /red/ || $line =~ /yellow/ ||$line =~ /black/)
        {
            $count++; 
        }
        print($line);
        $line = <LOG>; 
    }
    print("Just finished a chunk.\n");
}

$line = <LOG>;
}
print($fix, "\n");

但是,这是一个不断抛出错误的无限循环,我不知道为什么。

4

2 回答 2

3

您可以按“块”而不是按行读取文件

local $/ = "\n\n";
while(my $chunk = <LOG>) { 
  .. 
  print("Just finished a chunk.\n");
}
于 2013-05-21T20:25:27.657 回答
1

您进入一个无限循环,因为当您到达文件末尾并且$line未定义时,表达式

$line !~/\A\n\z/

仍然是真的。你可以尝试类似的东西

    ...
    while (defined($line) && $line !~ /\A\n\z/) {
       ...

反而。

于 2013-05-21T20:27:06.230 回答