2013-08-26 203 views
0

比方說,我有一個函數「start_ip_address」,「ip_address_increment」和「number_of_increment」的參數。在Perl中添加IP地址?

我想打印start_ip_address,然後該地址遞增number_of_increment次數。

所以,如果 「start_ip_address」= 192.168.0.0和 「ip_address_increment」= 0.0.1.1和 「number_of_increment」= 3,我想打印:

192.168.0.0 

192.168.1.1 

192.168.2.2 

192.168.3.3 

我怎樣才能做到這一點?我用Perl字符串處理很糟糕。

+2

如果你增加一個IP地址,應該不會是192.168.0.1,192.168.0.2,192.168.0.3,...,192.168.0.254,192.168.0.255,192.168.1.0,192.168。 1.1等?同時增加兩個八位字節沒有多大意義。 –

回答

3

IPv4地址只是32位整數。每個數字代表一個字節。

sub to_num { unpack 'N', pack 'C4', split /\./, $_[0] } 
sub fr_num { join '.', unpack 'C4', pack 'N', $_[0] } 

my $ip = to_num($start_ip_address); 
my $inc = to_num($ip_address_increment); 

say fr_num($ip); 
for (1..$number_of_increments) { 
    $ip += $inc; 
    say fr_num($ip); 
} 
+0

從技術上講,IP地址是無符號的32位整數。如果地址大於「127.255.25.255」,帶符號的整數將會有添加問題。 –

+0

正確,但文字說,「_just 32位整數_」。我不希望任何人閱讀它來得到錯誤的想法。 –

+0

@Ron Maupin,這是不正確的。人們可以輕鬆地使用帶符號整數作爲無符號整數。例如,'pack「l>」,-1062731776'和'pack「L>」,3232235520'都給出了相同的4個八位字節。只有八位字節需要被視爲無符號('C'而不是'c'),並且即使這樣,只有在解包時。 – ikegami