我从F5 LTM中提取SNMP信息,并将此信息存储在psql数据库中。我需要帮助将十进制格式的返回数据转换为ASCII字符。 以下是SNMP请求返回的信息示例:
iso.3.6.1.4.1.3375.2.2.10.2.3.1.9.10.102.111.114.119.97.114.100.95.118.115 = Counter64: 0
在我的脚本中,我需要确定此信息的不同部分:
my ($prefix, $num, $char-len, $vs) = ($oid =~ /($vsTable)\.(\d+)\.(\d+)\.(.+)/);
这给了我以下内容:
(prefix= .1.3.6.1.4.1.3375.2.2.10.2.3.1)
(num= 9 )
(char-len= 10 )
(vs= 102.111.114.119.97.114.100.95.118.115)
变量$vs
是十进制格式的对象名称。我想将其转换为ASCII字符(应该是“forward_vs”)。
有人有关于如何做到这一点的建议吗?
答案 0 :(得分:2)
鉴于这与解释SNMP数据有关,使用CPAN提供的SNMP modules中的一个或多个似乎合乎逻辑。您必须了解很多关于SNMP的信息,以确定您引用的字符串何时停止作为标识符(前缀)并开始为值。使用SNMP代码获得通用解决方案比使用手动黑客代码更有可能。
答案 1 :(得分:1)
Jonathan Leffler有正确的答案,但这里有几件事要扩展你的Perl视野:
use v5.10;
$_ = "102.111.114.119.97.114.100.95.118.115";
say "Version 1: " => eval;
say "Version 2: " => pack "W".(1+y/.//) => /\d+/g;
执行,打印:
Version 1: forward_vs
Version 2: forward_vs
一旦两者都清楚,你可能会占据空间继续或q退出。 :)
编辑:最后一个也可以写成
pack "WW".y/.//,/\d+/g
但请不要。 :)
答案 2 :(得分:0)
my $new_vs = join("", map { chr($_) } split(/\./,$vs));
答案 3 :(得分:0)
简单的解决方案:
$ascii .= chr for split /\./, $vs;
答案 4 :(得分:0)
pack 'C*', split /\./
例如,
>perl -E"say pack 'C*', split /\./, $ARGV[0]" 102.111.114.119.97.114.100.95.118.115
forward_vs