2

我正在通过 Cisco 路由器上的 SNMP 查找收集器信息。我收集信息没有任何问题。问题出在我的 Perl 正则表达式中。

此处的阵列接收到 SNMP:

$ mystring = 'iso.3.6.1.2.1.2.2.1.2.2 = STRING: "GigabitEthernet1/2"
iso.3.6.1.2.1.2.2.1.2.3 = STRING: "GigabitEthernet3/1"
iso.3.6.1.2.1.2.2.1.2.4 = STRING: "GigabitEthernet3/2"
iso.3.6.1.2.1.2.2.1.2.5 = STRING: "GigabitEthernet3/3"
iso.3.6.1.2.1.2.2.1.2.6 = STRING: "GigabitEthernet3/4"
iso.3.6.1.2.1.2.2.1.2.7 = STRING: "GigabitEthernet3/5"
iso.3.6.1.2.1.2.2.1.2.8 = STRING: "GigabitEthernet3/6"
iso.3.6.1.2.1.2.2.1.2.9 = STRING: "GigabitEthernet3/7"
iso.3.6.1.2.1.2.2.1.2.10 = STRING: "GigabitEthernet3/8"
iso.3.6.1.2.1.2.2.1.2.11 = STRING: "GigabitEthernet3/9"
iso.3.6.1.2.1.2.2.1.2.12 = STRING: "GigabitEthernet3/10"
iso.3.6.1.2.1.2.2.1.2.13 = STRING: "GigabitEthernet3/11"
iso.3.6.1.2.1.2.2.1.2.14 = STRING: "GigabitEthernet3/12"
iso.3.6.1.2.1.2.2.1.2.15 = STRING: "GigabitEthernet3/13"
iso.3.6.1.2.1.2.2.1.2.16 = STRING: "GigabitEthernet3/14"
iso.3.6.1.2.1.2.2.1.2.17 = STRING: "GigabitEthernet3/15"
iso.3.6.1.2.1.2.2.1.2.18 = STRING: "GigabitEthernet3/16" ';
@ array = ($ mystring = ~ m /. ([0-9]|[1-9][0-9]|[1-9][0-9][0-9]) = / gms);
print join ("\ n", @ array);

我有最新一期的 mib 但如何获取端口?例如

array(    
5->GigabitEthernet3/3
6->GigabitEthernet3/4
);

在一张桌子上。

4

1 回答 1

2

你所说的数组实际上是一个关联数组。哈希表是关联数组的一种形式。

use strict; use warnings;
my %port_by_mib;
for (split /\n/, $mystring) {
    my ($mib) = /\.(\d+) / or die;
    my ($port) = /"([^"]+)"/ or die;
    $port_by_mib{$mib} = $port;
}

解释:

  • use strict以更严格的模式运行 Perl。这不允许危险或容易出错的功能。use warnings将发出有助于调试脚本的警告。
  • my关键字声明词法变量。在严格模式下需要声明变量。如果您忘记声明名称,您将收到global symbol "$foo" requires explicit package name ...致命错误。
  • %是哈希表的标志。Sigils 既是类型声明又是命名空间选择器。
  • split$mystring正则表达式匹配时剪切。for循环遍历生成的子字符串列表并将每个部分分配给$_默认参数。
  • 正则表达式/\.(\d+) /匹配并保存前面有一个点和后面有一个空格的任何数字序列。die当没有找到这样的匹配时,脚本s(即抛出一个致命错误)。赋值的左侧有一个列表上下文,因此 RHS 也在列表上下文中执行,导致$mib使用第一个捕获缓冲区进行初始化。
  • 正则表达式/"([^"]+)"/匹配双引号中的文本,并提取该文本。
  • 哈希表使用花括号访问,而不是像数组那样使用方括号。
于 2012-12-06T17:58:12.530 回答