логика perl if-then-else и как обрабатывать данные, если регулярное выражение не совпадает - PullRequest
0 голосов
/ 06 июля 2010

Пока у меня есть некоторый рабочий код, который входит в список серверов и выполняет некоторые регулярные выражения для получения данных из файла журнала. То, что я хочу сделать, это вывести состояние «НИЧЕГО ОТЧЕТА ДЛЯ ЭТОГО СЕРВЕРА», если нет данных для сбора из регулярного выражения на конкретном сервере.

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

Вот копия вывода, как он работает сейчас ДО Я добавил изменение:

========================================================================
REPORTING SUMMARY for BACKUP SERVER : hostname1
========================================================================
REPORTING SUMMARY for BACKUP SERVER : hostname2
Mon Jul 05 00:30:02 2010: hostname2:backup:INFO: backup-date=20100705003002
Mon Jul 05 00:30:02 2010: hostname2:backup:INFO: host=hostname2
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-size=49.75 GB
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-time=00:25:23
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-status=Backup succeeded
========================================================================

Вот копия вывода сейчас, ПОСЛЕ Я добавил «НИЧЕГО, ЧТОБЫ ОТЧЕТИТЬ ЗА ЭТУ ДАТУ»: (внутри цикла while). По сути, он печатает это утверждение каждый раз, когда оно не совпадает. Я действительно хочу, чтобы это дало мне одно заявление.

========================================================================
REPORTING SUMMARY for BACKUP SERVER : hostname1
NOTHING TO REPORT FOR THIS DATE... 
NOTHING TO REPORT FOR THIS DATE... 
NOTHING TO REPORT FOR THIS DATE... 
...
...
========================================================================
NOTHING TO REPORT FOR THIS DATE... 
Mon Jul 05 00:30:02 2010: hostname2:backup:INFO: backup-date=20100705003002
Mon Jul 05 00:30:02 2010: hostname2:backup:INFO: host=hostname2 
NOTHING TO REPORT FOR THIS DATE... 
NOTHING TO REPORT FOR THIS DATE...
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-size=49.75 GB
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-time=00:25:23
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-status=Backup succeeded

Вот код:

# Usage: ./test.pl Ju1 05 2010 <logfilepath> hostname1 hostname2 hostname3
use strict;
use warnings;
my($mon,$day,$year,$file) = @ARGV;
splice(@ARGV, 0, 4, ());            
foreach my $server ( @ARGV ) {      
    print "========================================================================\n";
    print "REPORTING SUMMARY for BACKUP SERVER : $server\n";
    open(my $fh,"ssh $server cat $file |") or die "can't open log $server:$file: $!\n";
    while (my $line = <$fh>) {
        if ($line =~ m/.* $mon $day \d{2}:\d{2}:\d{2} $year:.*(host=|ERROR:|backup-date=|backup-size=|backup-time=|backup-status)/) {
            print $line;
            # adding else statement here
            } else {
            print "NOTHING TO REPORT FOR THIS DATE... \n";
        }
    }
    close($fh);
}

Ответы [ 3 ]

8 голосов
/ 06 июля 2010
  1. Установить логическое значение false.
  2. Если в цикле while найдено регулярное выражение, установите для логического значения значение true.
  3. Вне цикла while, если логическое значение все еще равно false, выведите НИЧЕГО, ЧТОБЫ ОТЧЕТАТЬ.
1 голос
/ 07 июля 2010

Это работает сейчас:

use strict;
use warnings;
my($mon,$day,$year,$file) = @ARGV;
my $has_data = 0;
splice(@ARGV, 0, 4, ());            
foreach my $server ( @ARGV ) {     
    print "========================================================================\n";
    print "REPORTING SUMMARY for BACKUP SERVER : $server\n";
    open(my $fh,"ssh $server cat $file |") or die "can't open log $server:$file: $!\n";
    while (my $line = <$fh>) {
        if ($line =~ m/.* $mon $day \d{2}:\d{2}:\d{2} $year:.*(host=|ERROR:|backup-date=|backup-size=|backup-time=|backup-status)/) {
            print $line;
            $has_data=1; #set to true
            #print "Boolean is set to $has_data \n";
        }
    } #end while loop
        if ($has_data==0) {
           print "Boolean is set to $has_data \n";
           print "NOTHING TO REPORT FOR THIS DATE... \n";
        }
       $has_data=0;
       print "Boolean is reset to $has_data \n";
    close($fh);
}
0 голосов
/ 07 июля 2010

Не думаю, я правильно понял.Я попытался, как предложено (@mcandre), и поместил его вне цикла while, и все еще продолжал работать так же.Где я должен разместить этот чек?

use strict;
use warnings;
my($mon,$day,$year,$file) = @ARGV;
my $boolean = 0;
splice(@ARGV, 0, 4, ());            
foreach my $server ( @ARGV ) {      
    print "========================================================================\n";
    print "REPORTING SUMMARY for BACKUP SERVER : $server\n"; 
    open(my $fh,"ssh $server cat $file |") or die "can't open log $server:$file: $!\n";
    while (my $line = <$fh>) {
        if ($line =~ m/.* $mon $day \d{2}:\d{2}:\d{2} $year:.*(host=|ERROR:|backup-date=|backup-size=|backup-time=|backup-status)/) {
            print $line;
            $boolean=1; #set to true
            #print "Boolean is set to $boolean \n";
        }
    } #end while loop
        if ($boolean=0) {
           print "Boolean is set to $boolean \n";
           print "NOTHING TO REPORT FOR THIS DATE... \n";
        }
    close($fh);
}
...