Perl将长IPv6地址转换为紧凑表示法

时间:2017-08-29 15:25:13

标签: perl ipv6

我在标量中有一个很长的IPv6地址,如

2001:0db8:0:0:0:0:0:0

并希望得到紧凑的符号:

2001:db8::.

主要的Perl包/usr/lib/perl5/...是否包含一个可以执行此操作的模块?

Net :: IP模块吗?

如果没有,有人会有几行会这样做吗?

Net::IP::ip_expand_address相反的排序。

3 个答案:

答案 0 :(得分:2)

NetAddr::IP模块提供了short方法来实现这一目标。

示例:

#!/usr/bin/env perl
use strict;
use warnings;
use NetAddr::IP;

my $ip = NetAddr::IP->new( '2001:0db8:0:0:0:0:0:0' );

print "Long version: " . $ip->addr . "\n";
print "Short/Compact version: " . $ip->short . "\n";

答案 1 :(得分:0)

模块IPv6::Address可以在调用addr_string方法时执行此操作,但它不在核心中。但是,您可以相当快地借用the code that does it

我所做的只是创建紧凑符号的部分,并将其包装在sub中。

sub compact {

    # taken from IPv6::Address on CPAN
    my $str = shift;
    return '::' if($str eq '0:0:0:0:0:0:0:0');
    for(my $i=7;$i>1;$i--) {
            my $zerostr = join(':',split('','0'x$i));
            ###print "DEBUG: $str $zerostr \n";
            if($str =~ /:$zerostr$/) {
                    $str =~ s/:$zerostr$/::/;
                    return $str;
            }
            elsif ($str =~ /:$zerostr:/) {
                    $str =~ s/:$zerostr:/::/;
                    return $str;
            }
            elsif ($str =~ /^$zerostr:/) {
                    $str =~ s/^$zerostr:/::/;
                    return $str;
            }
    }
    return $str;
}


print compact('2001:0db8:0:0:0:0:0:0');

这将打印

2001:0db8::

对于已压缩的字符串似乎也没问题。

答案 2 :(得分:0)

Net :: IP确实提供了压缩IP的ip_compress_address方法。