Perl十进制到ASCII转换

时间:2011-08-22 00:11:25

标签: regex perl ascii decimal

我从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”)。 有人有关于如何做到这一点的建议吗?

5 个答案:

答案 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