【问题标题】:perl - using given gives errorsperl - 使用给定的错误
【发布时间】:2017-02-17 17:54:57
【问题描述】:

我几乎完成了一个 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) { 开始,然后在之后的每一行都出现在";}"

【问题讨论】:

  • 一目了然——$percent_down ge $warn && lt $crit——你不能做$var ge $c1 && lt $c2。那些&& lt 没有任何意义。完成条件,$var ge $c1 && $var lt $c2。并注意优先级。如果这些确实是数字,请使用>=< 等。
  • 对数字使用<>=,而不是ltge。 (例如,9 ge 10 为真。)
  • 您是否启用了given 功能?你需要吗? use feature "switch"; ...
  • 据说是实验性的,但是为什么呢?在这里阅读:perldoc.perl.org/…
  • 我建议您忽略该指南。这是对givenwhen的滥用

标签: perl nagios


【解决方案1】:

要使用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。这是一项实验性功能, 将来会以向后不兼容的方式删除或更改。


一旦你解决了上述问题并删除了多余的检查,你就会得到以下结果:

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

【讨论】:

    【解决方案2】:

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

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

    我建议您使用像这样的ifelsifelse 序列来编写它。我相信这种方式更具可读性

    #!/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;
    }
    

    【讨论】:

      【解决方案3】:

      感谢cmets,我知道了。

      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;
              }
      

      【讨论】:

      • 使用您要求的答案。当你做出选择时,你应该选择其中一个并接受它。
      • 当时没有其他答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 2016-08-29
      相关资源
      最近更新 更多