我在标量中有一个很长的IPv6地址,如
2001:0db8:0:0:0:0:0:0
并希望得到紧凑的符号:
2001:db8::.
主要的Perl包/usr/lib/perl5/...
是否包含一个可以执行此操作的模块?
Net :: IP模块吗?
如果没有,有人会有几行会这样做吗?
与Net::IP::ip_expand_address相反的排序。
答案 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方法。