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模块有吗?
如果没有,有人有几行可以做到这一点吗?
模块 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 的方法。
我有一个像
这样的标量中的长 IPv6 地址2001:0db8:0:0:0:0:0:0
并希望获得紧凑的表示法:
2001:db8::.
Perl 主程序包 /usr/lib/perl5/...
是否包含执行此操作的模块?
Net::IP模块有吗?
如果没有,有人有几行可以做到这一点吗?
模块 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 的方法。