2011-01-26 1 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 모듈을 좋아한다. –

+0

'$ ip = Net :: IP :: ip_expand_address ('2001 : db8 :: 1', 6);'나를 위해 할 것이고, 여분의 객체는 필요 없다. – user562374

2

Net::IP 확실히 갈 수있는 좋은 방법입니다, 쉽고 강력하기 때문이다. 그러나 이들 중 많은 수를 분석하려는 경우 Socket 패키지의 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