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
现在解决你没有问的问题。
lt
和 ge
用于比较字符串。使用 <
和 >=
比较数字。 (例如,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;
}
出于多种原因,建议您最好避免使用 given
和 when
。即使您正确启用了该功能,您也会收到另一组警告消息,告诉您该功能是实验性的,并且在任何情况下您都没有使用该功能有用的设施——主要是智能匹配,这也是实验性的
最后的 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;
}
我几乎用完了一个 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
现在解决你没有问的问题。
lt
和 ge
用于比较字符串。使用 <
和 >=
比较数字。 (例如,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;
}
出于多种原因,建议您最好避免使用 given
和 when
。即使您正确启用了该功能,您也会收到另一组警告消息,告诉您该功能是实验性的,并且在任何情况下您都没有使用该功能有用的设施——主要是智能匹配,这也是实验性的
最后的 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;
}