Perl выводит один вывод при совпадении строки - PullRequest
0 голосов
/ 15 февраля 2012

Я пишу этот простой код, чтобы получать оповещения по электронной почте при обнаружении «ошибки» в моем журнале.

Вопрос в том, что я хочу получать только одно предупреждение за сканирование, мой код генерирует количество предупреждений на основе числа ошибок, сопоставленных с файлом.

open (LOG, "<$log") || die 'Could not OPEN log file';
while ($loglines = <LOG> ) {
if ($loglines =~ /Error/) { 
    print "Error on the log \n";
}
 }
 close (LOG);

результат выглядит как

Ошибка в журнале

Ошибка в журнале

Ошибка в журнале

Ошибка в журнале

Ошибка в журнале

Вместо этого я хочу только одну распечатку «Ошибка в журнале», чтобы я мог получить одно электронное письмо, когда ошибка совпадает с файлом журнала.Что я пропустил?

1 Ответ

3 голосов
/ 15 февраля 2012
open my $LOG, "<", $log or die "Could not OPEN log file $log";
while (my $loglines = <$LOG>) {
  if ($loglines =~ /Error/) { 
   print "Error on the log\n";
   last;
  }
}
close($LOG);

В этом много улучшений.Наиболее важным изменением является добавление last;;он завершает цикл при первом совпадении.

Другие изменения:

  • Использование дескриптора лексического файла.
  • Использование открытия с тремя аргументами.
  • Использование 'or' вместо '||'.
  • Локальная переменная для $loglines (при условии, что она вам не нужна / не используется в другом месте).
  • Ошибкасообщение указывает, какой файл не может быть открыт (проще для отладки!).
  • Нет пробела в печатной строке сообщения.

Некоторые предпочитают метку, добавленную в цикл, а затемЯвное использование этого в выражении last:

open my $LOG, "<", $log or die "Could not OPEN log file $log";
LOG_READER:
while (my $loglines = <$LOG>) {
  if ($loglines =~ /Error/) { 
   print "Error on the log\n";
   last LOG_READER;
  }
}
close($LOG);

Я не уверен, что здесь есть большой выигрыш, предполагая, что в нем нет замкнутых циклов.Если есть какие-либо замкнутые циклы, тогда используйте метку.

Я предполагаю, что вы используете:

use strict;
use warnings;

вверху вашего скрипта?Если нет, то сделай так.Эксперты Perl используют их, чтобы избежать глупых ошибок;Новички в Perl должны использовать их по тем же причинам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...