【问题标题】:Split array into chunks, execute snmp_get_request on each chunk, re-combine the resulting hash references将数组拆分为块,对每个块执行 snmp_get_request,重新组合生成的哈希引用
【发布时间】:2011-06-11 04:35:20
【问题描述】:

我在尝试使用利用 Net::SNMP 的 Nagios 插件时遇到问题。它尝试同时查询大量 OID,从而导致错误,因为响应将超过链路的最大 MTU。 (消息大小 2867 超过 maxMsgSize 1472。)

本节代码如下:

$result = $session->get_request(
   Varbindlist => \@oids
);

Perl 中有没有办法

  1. 将@oid 拆分成更小的部分
  2. 迭代这些片段
  3. 将返回的 $results 组合成对单个哈希的单个引用?

这将是对脚本进行的最小修改以使其支持更多的接口,对吗?

【问题讨论】:

    标签: perl snmp nagios


    【解决方案1】:
    1) Split @oids into smaller pieces
    2) Iterate over these pieces
    

    使用 splice() 将列表分解为更小的列表。如果您一次想要十个:

    while (@oids) {
        my @sublist = splice @oids, 0, 10;
        # do something with the 10 (or less) elements in @sublist
    }
    

    【讨论】:

      【解决方案2】:

      此代码未经测试,但我提供它作为您如何划分列表并使用它运行的一般想法。

      my $divisions = int ( @oids / 10 );
      my $offset = 0;
      my @oids_list;
      while ( $offset <= $#oids ) {
          my $top = $offset + $divisions;
          $top = $top <= $#oids ? $top : $#oids
          push @oids_list, [ @oids[ $offset .. $top ] ];
          $offset += $divisions + 1;
      }
      my @results;
      
      foreach my $oids_ref ( @oids_list ) {
          push @results, $session->get_request(
              Varbindlist => $oids_ref
      }
      

      现在,如果我的计算正确,您将获得@results,它将是每次迭代 $session->get_request() 的返回值的列表。我不知道那是什么样子;也许你只是将​​它连接在一起。那是你要弄清楚的部分。 ;)

      【讨论】:

        猜你喜欢
        • 2017-09-03
        • 2012-01-19
        • 2011-07-26
        • 2022-01-06
        相关资源
        最近更新 更多