if ($time =~ /^[01]?\d\./) {       # time is 0-9 seconds or 10-19 seconds
    $status = "OK";
}
elsif ($time =~ /^(2\d|30)\./) {   # time is 20-30 seconds
    $status = "WARNING";
}
else {                             # any other time is critical
    $status = "CRITICAL";
}

В приведенном выше коде у меня есть некоторые пороги. Мне нужно изменить 0–10 на OK, 10–30 на WARNING, а все остальное - на CRITICAL. Строка - это время типа 1.0, 1.11, 13.51 или 2:13.52.

0
klerk 18 Дек 2013 в 16:14

2 ответа

Лучший ответ

Часто говорят, что когда у вас есть молоток, каждая проблема начинает выглядеть как гвоздь, и это верно в данном случае, когда вы используете сопоставление с образцом для простого численного сравнения.

Почему вы не оцениваете их как числа? Это было бы намного удобнее в обслуживании.

$status = "CRITICAL";
if ($time =~ /^(\d+)\./) { # Starts with seconds
    $seconds = $1;
    $status = "WARNING" if ($seconds <= 30);
    $status = "OK" if ($seconds <= 10);
    # If status is OK, print a message
    print "$status: Execution took $seconds seconds" if ($status eq "OK");
} else {
    # Time doesn't start with seconds, so status is critical
}

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

2
Glitch Desire 18 Дек 2013 в 12:34

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

  1. Извлеките число из строки
  2. Используйте числовые операторы сравнения, чтобы назначить уровень

Это может выглядеть так:

sub level {
  my ($time) = @_;
  $time =~ /\A (?: (?: (?<hours>[0-9]+): )? (?<minutes>[0-9]+): )?  (?<seconds>[0-9]+) [.]/x
    or die "Can't match seconds";
  my $seconds = $+{seconds} + 60 * ($+{minutes} + 60*$+{hours});

  my $warning  = 20;
  my $critical = 31;

  my $status = ($seconds < $warning ) ? "OK"
             : ($seconds < $critical) ? "WARNING"
             :                          "CRITICAL";
  return $status;
}

use Test::More tests => 8;

is level("1.0"),     "OK";
is level("1.11"),    "OK";
is level("13.51"),   "OK";
is level("2:13.52"), "CRITICAL";
is level("26.0"),    "WARNING";
is level("26.11"),   "WARNING";
is level("2:26.52"), "CRITICAL";
is level("0:26.52"), "WARNING";
2
amon 18 Дек 2013 в 12:39