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

  • 本文关键字:初始化 pl test 45行 除法 perl
  • 更新时间 :
  • 英文 :


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

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;

这就是我从打印Dumper$result:$VAR1=undef中得到的;

但如果我将删除if条件,则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;

你没有得到错误,你得到的是警告。

这意味着$$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);

那么它就会起作用。

更新2:从您问题的更新中,我看到您正在从呼叫get_request()获得undef。文件上写着:

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

所以你的下一步行动似乎很明显。

my $result = $session->get_request(-varbindlist => @oidlist)
  or warn $session->error.

最新更新