perl - 使用给定给出错误

perl - using given gives errors

我几乎用完了一个 nagios 插件,我正在使用这个 guide. 虽然我遇到了错误,但我不确定为什么。

#!/bin/perl
use strict;
use warnings;

my $warn = 20;
my $crit = 50;
my $percent_down = 10;
my $percent_up = 90;
my $err = "error";

given ($percent_down) {
        when ($percent_down lt $warn) { print "OK - $percent_up% UP"; exit 0;}
        when ($percent_down ge $warn && lt $crit ) { print "WARNING - $percent_down% DOWN"; exit (1);}
        when ($percent_down ge $crit) { print "CRITICAL - $percent_down% DOWN"; exit (2);}
        default { print "UNKNOWN - $err "; exit (3);}
}

我在 ") {"given ($percent_down) { 开始语法错误,然后在之后的每一行 ";}" 处出现语法错误。

要使用given,您需要

no if $] >= 5.018, warnings => "experimental::smartmatch";
use feature qw( switch );

此外,

$percent_down ge $warn && lt $crit

应该是

$percent_down ge $warn && $percent_down lt $crit

现在解决你没有问的问题。

ltge 用于比较字符串。使用 <>= 比较数字。 (例如,9 ge 10 为真。)


最后,你不应该使用given-when。这是一项实验性功能,将来会 以 backwards-incompatible 方式删除或更改。


解决上述问题并删除多余的检查后,您将得到以下内容:

if ($percent_down < $warn) {
   print "OK - $percent_up% UP";
   exit(0);
}

if ($percent_down < $crit) {
   print "WARNING - $percent_down% DOWN";
   exit(1);
}

print "CRITICAL - $percent_down% DOWN";
exit(2);

感谢评论,我知道了

if ($percent_down lt $warn) {
        print "OK - $percent_up% UP";
        exit 0;
        } elsif ($percent_down ge $warn && $percent_down lt $crit ) {
        print "WARNING - $percent_down% DOWN";
        exit 1;
        } elsif ($percent_down ge $crit) {
        print "CRITICAL - $percent_down% DOWN";
        exit 2;
        } else {
        print "UNKNOWN - $err ";
        exit 3;
        }

出于多种原因,建议您最好避免使用 givenwhen。即使您正确启用了该功能,您也会收到另一组警告消息,告诉您该功能是实验性的,并且在任何情况下您都没有使用该功能有用的设施——主要是智能匹配,这也是实验性的

最后的 when 区块永远无法进入,因为前面的条件涵盖了所有可能性

我建议您使用这样的 if elsif else 序列来编写它。我相信这样更易读

#!/bin/perl

use strict;
use warnings 'all';

my $warn = 20;
my $crit = 50;

my $percent_down = 10;
my $percent_up   = 100 - $percent_down;

if ( $percent_down < $warn ) {
    print "OK - $percent_up% UP";
    exit 0;
}
elsif ( $percent_down < $crit ) {
    print "WARNING - $percent_down% DOWN";
    exit 1;
}
else {
    print "CRITICAL - $percent_down% DOWN";
    exit 2;
}