0

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

本节代码如下:

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

Perl有没有办法

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

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

4

2 回答 2

3
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
}
于 2011-06-11T12:50:26.990 回答
0

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

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() 的返回值列表。我不知道那是什么样子;也许你只是将​​它连接在一起。那是你要弄清楚的部分。;)

于 2011-06-11T04:49:25.267 回答