Perl - 变量的值在某一条件下不工作。

问题描述 投票:0回答:1

我创建了这个函数。

当我打印我的变量 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 variables conditional-statements
1个回答
3
投票

你的问题与类型无关。

每个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。

© www.soinside.com 2019 - 2024. All rights reserved.