Perl - значение переменной не работает в условии - PullRequest
1 голос
/ 27 апреля 2020

Я создал эту функцию.

Когда я печатаю свою переменную 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=$_;
    };

1 Ответ

3 голосов
/ 27 апреля 2020

Ваша проблема не имеет ничего общего с типом.

Первое, что должен усвоить каждый 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 c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...