我创建了这个函数。
当我打印我的变量 my $bios_current
,它显示 $VAR1 = '200';
但我的情况 if ( $bios_current->responseCode() ne 200)
认为它不是200。
你能帮帮我吗?是类型问题吗?
sub check_thermalshutdown_settings {
my $host = shift;
if ($host->get_property('summary.hardware.model') eq "ProLiant DL360 Gen9") {
my $error="";
my $bios="";
try {
my $ilo = get_ilo_address($host->name);
my $client = REST::Client->new();
$client->setHost("https://$ilo");
$client->addHeader("Authorization", "Basic blabla==");
eval {
local $SIG{ALRM} = sub { };
alarm 3;
#$client->GET("/redfish/v1/Systems/1/Bios/");
my $bios_current = $client->GET("/redfish/v1/Systems/1/Bios/");
print Dumper $bios_current->responseCode;
alarm 0;
};
if ( $bios_current->responseCode() ne 200) {
$bios = "none";
$error = "Redfish API returned code ".$client->responseCode();
print Dumper $client->responseCode();
} else {
my $json = decode_json($client->responseContent());
#print Dumper $client->responseContent();
#$bios = $json->{'Bios'}->{'Settings'}->{'ThermalShutdown'};
$bios = $json->{'ThermalShutdown'};
#print Dumper $bios;
print Dumper $json->{'ThermalShutdown'};
print "API call is ok\n";
print Dumper $client->setHost("https://$ilo");
}
} catch {
$bios = "none";
$error=$_;
};
你的问题与类型无关。
每个Perl编码者首先应该学会的是,在每个脚本的顶部都应该出现以下两条语句。
use strict;
use warnings;
这两条语句可以捕获大量的错误,其中一条就是你的问题的原因。
如果你看一下你的 eval 块
eval {
local $SIG{ALRM} = sub { };
alarm 3;
#$client->GET("/redfish/v1/Systems/1/Bios/");
my $bios_current = $client->GET("/redfish/v1/Systems/1/Bios/");
print Dumper $bios_current->responseCode;
alarm 0;
};
你会发现,变量$bios_current是由下面的 my
修饰符将变量的寿命限制在当前的作用域,在本例中是eval块。
所以当你的if语句运行的时候,变量已经不存在了,Perl会帮你创建一个新的空变量,然后Perl会尝试在空变量上调用responseCode(),这个失败了,通常会终止程序,但是此时你在try()块中,所以代码没有显示错误,而是跳转到了catch bloc。