Расширение / разбор IPv6-адресов Perl - PullRequest
4 голосов
/ 26 января 2011

У меня есть адрес типа 2001:db8::1 в скаляре, и я хотел бы получить расширенную форму, 2001:0db8:0000:0000:0000:0000:0000:0001. Поставляется ли основной пакет Perl - в его обширном лесу в /usr/lib/perl5/... - модуль, который уже сделает это? Если нет, есть ли у кого-нибудь несколько строк, которые бы это делали?

Ответы [ 2 ]

9 голосов
/ 26 января 2011

CPAN имеет Net::IP, который может делать то, что вам нужно.

Вот расшифровка, показывающая вам это в действии:

$ cat qq.pl
use Net::IP;
$ip = new Net::IP ('2001:db8::1');
print $ip->ip() . "\n";

$ perl qq.pl
2001:0db8:0000:0000:0000:0000:0000:0001
2 голосов
/ 18 декабря 2014

Net::IP, безусловно, отличный путь, потому что он легкий и мощный. Но, если вы собираетесь анализировать тонны из них, вы можете вместо этого использовать inet_pton из пакета Socket, поскольку это в 10-20 раз быстрее, чем версия объекта Net::IP, даже с предварительно созданным объектом. И в 4 раза быстрее, чем версия ip_expand_address:

use Net::IP;
use Time::HiRes qw(gettimeofday tv_interval);
use Socket qw(inet_pton AF_INET6);
use bignum;
use strict;

# bootstrap
my $addr = "2001:db8::1";
my $maxcount = 10000;

my $ip = new Net::IP($addr);

my ($t0, $t1);
my $res;

# test Net::IP
$t0 = [gettimeofday()];
for (my $i = 0; $i < $maxcount; $i++) {
    $ip->set($addr);
    $res = $ip->ip();
}
print "Net::IP elapsed:   " . tv_interval($t0) . "\n";
print "Net::IP Result:    $res\n";

# test non-object version
$t0 = [gettimeofday()];
for (my $i = 0; $i < $maxcount; $i++) {
    $res = Net::IP::ip_expand_address('2001:db8::1', 6);
}
print "ip_expand elapsed:  " . tv_interval($t0) . "\n";
print "ip_expand Result:   $res\n";

# test inet_pton
$t0 = [gettimeofday()];
for (my $i = 0; $i < $maxcount; $i++) {
    $res = join(":", unpack("H4H4H4H4H4H4H4H4",inet_pton(AF_INET6, $addr)));
}
print "inet_pton elapsed: " . tv_interval($t0) . "\n";
print "inet_pton result:  " . $res . "\n";

Запуск этого на случайной машине для меня произвел:

Net::IP elapsed:   2.059268
Net::IP Result:    2001:0db8:0000:0000:0000:0000:0000:0001
ip_expand elapsed: 0.482405
ip_expand Result:  2001:0db8:0000:0000:0000:0000:0000:0001
inet_pton elapsed: 0.132578
inet_pton result:  2001:0db8:0000:0000:0000:0000:0000:0001
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...