2010-02-17 44 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