2010-02-17 47 views
7

我需要在Perl中生成一個IP地址列表(IPv4)。我有開始和結束地址,例如1.1.1.1和1.10.20.30。我怎樣才能打印所有的地址?如何在Perl中生成一系列IP地址?

+0

爲什麼你需要這樣的事情? – pavium 2010-02-17 10:16:30

+2

我需要自動化一些系統管理任務。是的,用perl – planetp 2010-02-17 10:19:34

+0

好吧,Perl已經完成了一些奇怪的事情。 – pavium 2010-02-17 10:23:15

回答

4

使用Net::IP的循環功能:

+運營商是爲了讓循環,雖然IP的全系列解決重載:

3

這就是你如何編碼它。這是我知道的最快的方式。

my $start = 0x010101; # 1.1.1 
my $end = 0x0a141e; # 10.20.30 

for my $ip ($start..$end) { 
    my @ip = ($ip >> 16 & 0xff 
      , $ip >> 8 & 0xff 
      , $ip  & 0xff 
      ); 
    print join('.', 1, @ip), "\n"; 
} 
2

TMTOWTDI:

sub inc_ip { $_[0] = pack "N", 1 + unpack "N", $_[0] } 
my $start = 1.1.1.1; 
my $end = 1.10.20.30; 
for ($ip = $start; $ip le $end; inc_ip($ip)) { 
    printf "%vd\n", $ip; 
} 
+0

對於那些懶得谷歌它 - 「Theres不只一種方式做到這一點」 – 2010-02-17 11:06:53

+0

這種方法可以防止你的數字超過255嗎?對不起,我很難讀它,我不熟悉解壓縮,並且由於某種原因,我的網絡上的所有搜索引擎似乎都已關閉(不能以bing,yahoo或google的形式訪問) ) – onaclov2000 2010-02-17 13:19:57

+0

@ onaclov2000 http://p3rl.org/pack – 2010-02-17 14:35:20

7

使用Net::IP。從CPAN文檔:

my $ip = new Net::IP ('195.45.6.7 - 195.45.6.19') || die; 
# Loop 
do { 
    print $ip->ip(), "\n"; 
} while (++$ip); 

該方法更靈活,因爲Net :: IP接受CIDR表示法,例如, 193.0.1/24並且還支持IPv6。

編輯:如果您正在使用網絡塊,您可能會調查Net::Netmask

+0

I寧願這些網址:http://search.cpan.org/perldoc/Net::IP和http://search.cpan.org/perldoc/Net::Netmask – 2010-02-17 14:33:23

+0

@Sinan我覺得我的答案添加了足夠的額外信息值得發佈。反問題:爲什麼 - 我不應該向OP提供有用的信息?它如何傷害任何人? – rjh 2010-02-18 17:04:18

0
# We can use below code to generate IP range 

use warnings; 
use strict; 
my $startIp = $ARGV[0]; 
my $endIp = $ARGV[1]; 
sub range { 
my (@ip,@newIp,$i,$newIp,$j,$k,$l,$fh); 
my ($j1,$k1,$l1); 
open($fh,">","ip.txt") or die "could not open the file $!"; 
@ip = split(/\./,$startIp); 
for($i=$ip[0];$i<=255;$i++) { 
    for($j=$ip[1];$j<=255;$j++) { 
    $ip[1]=0 if($j == 255); 
    for($k=$ip[2];$k<=255;$k++) { 
     $ip[2]=0 if($k == 255); 
     for($l=$ip[3];$l<=255;$l++) { 
      $ip[3]=0 if($l == 255); 
      @newIp = $newIp = join('.',$i,$j,$k,$l); 
      print $fh "$newIp \n"; 
      exit if ($newIp eq $endIp); 
     } 
     } 
    } 
    } 
} 
range ($startIp, $endIp); 
+0

這是爲了循環的笑聲嗎?永遠不要循環太多。 – TheyDontHaveIT 2017-05-24 08:34:36