2011-01-26 17 views
4

私は2001:db8::1のようなアドレスをスカラーに持っていて、拡張形式の2001:0db8:0000:0000:0000:0000:0000:0001を取得したいと考えています。メインのPerlパッケージは、すでに広がっている/usr/lib/perl5/...の森林にありますか?そうでない場合は、誰かがこれを行ういくつかの行を持っていますか?Perl IPv6アドレスの拡張/解析

答えて

9

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 
+0

と 'ネット:: IP'がpure-perlのです。私は純粋なperlモジュールが大好きです。 –

+0

'$ ip = Net :: IP :: ip_expand_address( '2001:db8 :: 1'、6);'私のために、余分なオブジェクトは必要ありません。 – user562374

2

Net::IPは、間違いなく行くための素晴らしい方法です。しかし、それらのトンを解析しようとしている場合は、オブジェクトからinet_ptonを使用することを検討してください。Net::IPよりも10-20倍高速です。オブジェクトが事前に作成されています。そして4ish倍速く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 
関連する問題