2013-05-21 2 views
2

Я просматриваю журнал ошибок для ключевого слова «предупреждение». Когда я нахожу это, есть конкретный случай предупреждения, который закончит информацию, относящуюся к предупреждению, только с символом новой строки. То, что я хочу сделать, - это проверить этот журнал ошибок, найти предупреждение по ключевому слову, продолжать пропускать файл, пока я не найду ТОЛЬКО символ новой строки, а затем, как только я его найду, проанализирую этот фрагмент и распечатаю его.Grabbing Chunks данных из файла в Perl

формат будет что-то вроде этого:

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"); 

Однако, это бесконечный цикл, который постоянно вызывает ошибки, и я не знаю почему.

ответ

3

Вы можете прочитать файл на «куски», а не по линии

local $/ = "\n\n"; 
while(my $chunk = <LOG>) { 
    .. 
    print("Just finished a chunk.\n"); 
} 
+0

Как переменная $/влияет на оператор в то время? –

+0

'$ chunk' заполняется несколькими строками и читает их, пока не дойдет до двух символов' \ n \ n'. –

+0

Извините, немного новый для perl. «chunk» не является специальным ключевым словом, не так ли? Или ключевое слово: «$ /» ссылается на «переменная, которую я буду определять далее»? –

1

Вы войти в бесконечный цикл, потому что, когда вы дойдете до конца файла и $line не определено, выражение

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

все еще верно. Вы можете попробовать что-то вроде

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

вместо этого.

+0

Таким образом, чтобы зафиксировать бесконечный цикл, он выглядит. Однако теперь я получаю «Использование неинициализированного значения в сопоставлении с образцом (m //) в ./chunk.pl строке 12, строка 13." Строка 12 относится к: if ($ line = ~/warning/i) –

+0

Ах, строка не была инициализирована, я получил ее. –

Смежные вопросы