2017-08-29 45 views
0

我有一個標樣Perl的轉換龍IPv6地址以精簡的符號

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

長的IPv6地址,並且想獲得這些精簡的符號:

2001:db8::. 

做的主要工作Perl包/usr/lib/perl5/...包含一個將做到這一點的模塊?

Net :: IP模塊嗎?

如果沒有,是否有人會做幾行?

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

+0

除了你已經找到的功能之外,Net :: IP中沒有提到簡潔的符號。我們不能告訴你Perl中包含了什麼,因爲我們不知道你擁有哪個版本的Perl(以及在哪個操作系統上,因爲某些供應商包含不同的東西)。你可以通過運行'perl -v'來檢查你的Perl版本。您可以檢查某個模塊是否使用'corelist'實用程序進行編碼。你可以用'perl -MModule :: Name = 99'來檢查一個模塊是否可用,它會抱怨模塊丟失,或者告訴你你的版本太低。 – simbabque

+0

@simbabque只有當模塊使用'Exporter'時,''99''技巧纔會起作用,它會對任何看起來像數字的導入參數進行版本檢查。對於一個通用的解決方案,你需要''-MModule :: Name 99''(有一個空格)。甚至對於版本號大於2000的模塊(例如'File :: Slurp')也會失敗。 – melpomene

回答

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

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