我有一個標樣Perl的轉換龍IPv6地址以精簡的符號
2001:0db8:0:0:0:0:0:0
長的IPv6地址,並且想獲得這些精簡的符號:
2001:db8::.
做的主要工作Perl包/usr/lib/perl5/...
包含一個將做到這一點的模塊?
Net :: IP模塊嗎?
如果沒有,是否有人會做幾行?
與Net::IP::ip_expand_address相反的排序。
我有一個標樣Perl的轉換龍IPv6地址以精簡的符號
2001:0db8:0:0:0:0:0:0
長的IPv6地址,並且想獲得這些精簡的符號:
2001:db8::.
做的主要工作Perl包/usr/lib/perl5/...
包含一個將做到這一點的模塊?
Net :: IP模塊嗎?
如果沒有,是否有人會做幾行?
與Net::IP::ip_expand_address相反的排序。
的Net :: IP確實提供了ip_compress_address方法來壓縮IP。
模塊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::
這似乎是確定與已壓實串了。
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中沒有提到簡潔的符號。我們不能告訴你Perl中包含了什麼,因爲我們不知道你擁有哪個版本的Perl(以及在哪個操作系統上,因爲某些供應商包含不同的東西)。你可以通過運行'perl -v'來檢查你的Perl版本。您可以檢查某個模塊是否使用'corelist'實用程序進行編碼。你可以用'perl -MModule :: Name = 99'來檢查一個模塊是否可用,它會抱怨模塊丟失,或者告訴你你的版本太低。 – simbabque
@simbabque只有當模塊使用'Exporter'時,''99''技巧纔會起作用,它會對任何看起來像數字的導入參數進行版本檢查。對於一個通用的解決方案,你需要''-MModule :: Name 99''(有一個空格)。甚至對於版本號大於2000的模塊(例如'File :: Slurp')也會失敗。 – melpomene