Perl десятичное в ASCII преобразование - PullRequest
1 голос
/ 22 августа 2011

Я извлекаю информацию SNMP из LTM F5 и храню эту информацию в базе данных 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 ]

2 голосов
/ 22 августа 2011

Учитывая, что это связано с интерпретацией данных SNMP, мне кажется логичным использовать один или несколько из модулей SNMP , доступных в CPAN. Вы должны знать достаточно много о SNMP, чтобы определить, когда указанная строка перестает быть идентификатором (префиксом) и начинает быть значением. У вас больше шансов получить общее решение с кодом SNMP, чем с кодом, взломанным вручную.

1 голос
/ 22 августа 2011

Джонатан Леффлер имеет правильный ответ, но вот пара вещей, которые расширяют ваши горизонты 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

Но, пожалуйста, не надо. :)

0 голосов
/ 22 августа 2011
pack 'C*', split /\./

Например,

>perl -E"say pack 'C*', split /\./, $ARGV[0]" 102.111.114.119.97.114.100.95.118.115
forward_vs
0 голосов
/ 22 августа 2011

Простое решение:

$ascii .= chr for split /\./, $vs; 
0 голосов
/ 22 августа 2011
my $new_vs = join("", map { chr($_) } split(/\./,$vs));
...