首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Perl -变量的值在某个条件下不起作用

Perl -变量的值在某个条件下不起作用
EN

Stack Overflow用户
提问于 2020-04-27 21:31:00
回答 1查看 38关注 0票数 1

我创建了这个函数。

当我打印变量my $bios_current时,它显示$VAR1 = '200';,但我的条件if ( $bios_current->responseCode() ne 200)认为它不是200。

你能帮我吗?这是一个类型问题吗?

代码语言:javascript
运行
复制
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=$_;
    };
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-27 21:52:12

你的问题与类型无关。

每个Perl程序员应该学习的第一件事是下面两个语句应该出现在每个脚本的顶部。

代码语言:javascript
运行
复制
use strict;
use warnings;

这两个语句捕获了大量错误,其中一个是导致问题的原因。

如果你看看你的eval块

代码语言:javascript
运行
复制
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;
};

您将看到,变量eval是通过my修饰符引入的,这将变量的生存期限制在当前作用域,在本例中为$bios_current块。

因此,当您的if语句运行时,变量不再存在,Perl为您创建了一个新的空变量,然后Perl尝试对空变量调用responseCode(),这将失败,通常会终止程序,但是此时您处于try()块中,因此代码不会显示错误,而是跳转到catch块。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61460057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档