【问题标题】:Parsing SNMP results in Perl在 Perl 中解析 SNMP 结果
【发布时间】:2012-12-06 17:53:49
【问题描述】:

我正在通过 SNMP 在 Cisco 路由器上查找收集器信息。 我收集信息没有任何问题。问题出在我的 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
);

在表格中。

【问题讨论】:

  • 为什么不使用现有的Net::SNMP 模块而不是自己滚动?
  • @Giveme 请注意,sigils $@% 是变量名的一部分,并不是完全 运算符,因此最好删除额外的空间。此外,=~(正则表达式绑定)不同于= 赋值和~ 否定。您的/m 选项是货物崇拜编程,在这里没有任何意义,而/s. 的含义更改为“匹配任何内容,包括换行符”。要匹配句点字符.,必须对其进行转义,例如\.-> 运算符执行方法调用。 array() 是 PHPism;要使用它,请在您的代码中写入 sub array {wantarray ? @_ : \@_} ;)
  • 谢谢你的信息,我在PHP中间。我在 perl 方面还有一些差距;)

标签: perl parsing snmp cisco


【解决方案1】:

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

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 就会削减 $mystringfor 循环遍历生成的子字符串列表,并将每个部分分配给 $_ 默认参数。
  • 正则表达式/\.(\d+) / 匹配并保存前面为点且后面为空格的任何数字序列。当没有找到这样的匹配时,脚本dies(即抛出一个致命错误)。赋值的左侧有一个列表上下文,因此 RHS 也在列表上下文中执行,导致 $mib 使用第一个捕获缓冲区进行初始化。
  • 正则表达式/"([^"]+)"/ 匹配双引号中的文本,并提取该文本。
  • 使用大括号访问哈希表,而不是像数组那样使用方括号。

【讨论】:

  • 我包含了严格和警告,并添加了一段冗长的代码解释。
  • for (split /\n/, $mystring) { my ($mib) = /\.([0-9]|[1-9][0-9]|[1- 9][0-9][0-9])/或死;我的 ($port) = m/(\"(.*)")/s 要么死;推@{$mib},$port; } 打印自卸车\@$mib;退出;
  • 呵呵,我没用push?!?!
  • 我们的修改,对不起,我使用 push 只是为了学习:for (split /\n/, $mystring) { my ($mib) = /\.([0-9]|[1- 9][0-9]|[1-9][0-9][0-9])/或死;我的 ($port) = m/(\"(.*)")/s 要么死;推@{$mib},$port; } 打印自卸车\@$mib;退出;
  • 好的,我的结果对我有好处。我的 %port_by_mib;我的 $key;我的价值; for (split /\n/, $mystring) { # my ($mib) = /\.([0-9]|[1-9][0-9]|[1-9][0-9] [0-9]) = / 或死亡;我的 ($mib) = /\.(\d+) / 要么死;我的 ($port) = /"([^"]+)"/ 要么死;$port_by_mib{$mib} = $port; } 而 (($key,$value) = each %port_by_mib) { $value =~ s/\//-/g; print "$key=$value\n"; } exit;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多