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

Perl Convert Long IPv6 Address To Compact Notation

我有一个像

这样的标量中的长 IPv6 地址
2001:0db8:0:0:0:0:0:0

并希望获得紧凑的表示法:

2001:db8::.

Perl 主程序包 /usr/lib/perl5/... 是否包含执行此操作的模块?

Net::IP模块有吗?

如果没有,有人有几行可以做到这一点吗?

有点与Net::IP::ip_expand_address相反。

模块 IPv6::Address can do that when you call its addr_string method, but it's not in core. However, you can borrow 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::

似乎也可以使用已经压缩的字符串。

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";

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