在test.pl第45行使用除法(/)中未初始化的值

时间:2015-10-30 10:18:36

标签: perl

当我尝试运行我的perl脚本进行snmp检查时,我遇到了这样的错误:

Use of uninitialized value in division (/) at test.pl line 45.
Use of uninitialized value in division (/) at test.pl line 46.
Illegal division by zero at test.pl line 47.

有我的剧本:

     #!/usr/bin/perl

        use strict;
        use warnings;
        use Getopt::Long;
        use Net::SNMP;

        my $mem_used = "1.3.6.1.4.1.9.9.48.1.1.1.5";
        my $mem_free = "1.3.6.1.4.1.9.9.48.1.1.1.6";
        my $mem_used_asr = "1.3.6.1.4.1.9.9.221.1.1.1.1.18.7000.1";
        my $mem_free_asr = "1.3.6.1.4.1.9.9.221.1.1.1.1.20.7000.1";
        my $dev_check = "1.3.6.1.2.1.47.1.1.1.1.13.1";

        my ($session,$error);

        ($session, $error) = Net::SNMP->session(
                -hostname  => "some_IP_address",
                -version   => 2,
                -community => "some_community",
                -port      => 161,
                -timeout   => 15
                 );

        my @oidlists = ($dev_check);

        my $resultat = $session->get_request(-varbindlist => \@oidlists);

        $session->close;

        $resultat = "@{[%${resultat}]}";

        print $resultat;

        if ($resultat =~ /some_string/) {

                my @oidlist = ($_mem_used_asr, $_mem_free_asr);

  43.              my $result = $session->get_request(-varbindlist => \@oidlist);
                  or warn $session->error;
                   $session->close;
                  print Dumper $result;
                        $session->close;

                my @load = undef;

      45.              $load[0]=int($$result{$mem_used_asr}/1024/1024);
      46.              $load[1]=int($$result{$mem_free_asr}/1024/1024);
      47.              $load[2]=int($load[0]/($load[0]+$load[1])*100);

                print "Memory : used = $load[0] MB, free = $load[1] MB, utilization = $load[2] % :";

        } else {

                my @oidlist = ($_mem_used, $_mem_free);
                my $result = $session->get_request(-varbindlist => \@oidlist);
                        $session->close;

                my @load = undef;

                    $load[0]=int($$result{$mem_used}/1024/1024);
                    $load[1]=int($$result{$mem_free}/1024/1024);
                    $load[2]=int($load[0]/($load[0]+$load[1])*100);

                print "Memory : used = $load[0] MB, free = $load[1] MB, utilization = $load[2] % :";
        }

        exit;

这就是我从print Dumper获得的结果:$ VAR1 = undef;

但如果我将删除条件,则snmp请求正常工作。请你帮助我好吗? (是的,它非常新手perl脚本,因为我不擅长)

例如,这样的代码工作正常:

my @oidlist = ($mem_used_asr, $mem_free_asr);

        my $result = $session->get_request(-varbindlist => \@oidlist);

        $session->close;
        print $result;
        my @load = undef;

        $load[0]=int($$result{$mem_used_asr}/1024/1024);
                $load[1]=int($$result{$mem_free_asr}/1024/1024);
                $load[2]=int($load[0]/($load[0]+$load[1])*100);

                print "Memory : used = $load[0] MB, free = $load[1] MB, utilization = $load[2] % :";

exit;

1 个答案:

答案 0 :(得分:1)

您没有收到错误,您会收到警告。

这意味着$$result{$mem_used}$$result{$mem_free}都未定义。这意味着$load[0]$load[1]都将是未定义的,这会导致您的第三个错误。

所以我们需要仔细看看$result,看看那里发生了什么。我们从这行代码中获得$result

my $result = $session->get_request(@oidlist);

我们很难确定,因为我们无法确切知道什么类型的对象$session。你提到" snmp",所以让我们猜它是Net::SNMP个对象。该类有一个get_request()方法,它返回一个哈希引用 - 所以它可能是我的猜测是一个很好的(但作为未来的注释 - 要求帮助你调试问题的人做出像这样的猜测并不是很有礼貌。

除此之外,您在这里使用的$$result{$mem_used}语法非常不标准。大多数Perl程序员都会在$result->{$mem_used}处写出来。

如果$result->{$mem_used}未定义,则表示两件事之一。密钥$mem_used存在且关联值为undef。或者密钥不存在于散列中。您可以使用exists函数来检查这两种可能性中的哪一种。

我对SNMP知之甚少,但似乎您正确使用-varbindlist参数,所以我不认为我可以在追踪问题方面提供更多帮助。我会建议您使用类似Data::Dumper之类的内容,以便在您获得$result时显示-varbindlist的内容 - 这可能会让您更好地了解此处发生的事情。

更新:坚持下去。当我说你正确使用get_request()时,看起来我错了。您有两次拨打my $result = $session->get_request(@oidlist); $session->get_request(-varbindlist => \@oidlist);

-varbindlist

其中第二个调用具有正确的my $result = $session->get_request(-varbindlist => \@oidlist); 参数。第一个(以及你使用结果的那个)是不正确的。

我敢打赌,如果你把这两行合并到:

undef

然后它会起作用。

更新2 :从您的问题的更新中,我发现您从get_request()的电话回复my $result = $session->get_request(-varbindlist => \@oidlist) or warn $session->error. 。文档说:

  

在任一模式下,错误时都会返回未定义的值   发生了。 error()方法可用于确定原因   失败。

所以你接下来的步骤似乎非常明显。

SELECT