8

I need to generate a list of IP-addresses (IPv4) in Perl. I have start and end addresses, for example 1.1.1.1 and 1.10.20.30. How can I print all the addresses inbetween?

brian d foy
  • 129,424
  • 31
  • 207
  • 592
planetp
  • 14,248
  • 20
  • 86
  • 160

5 Answers5

8

Use Net::IP. From the CPAN documentation:

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

This approach is more flexible because Net::IP accepts CIDR notation e.g. 193.0.1/24 and also supports IPv6.

Edit: if you are working with netblocks specifically, you might investigate Net::Netmask.

Sinan Ünür
  • 116,958
  • 15
  • 196
  • 339
rjh
  • 49,276
  • 4
  • 56
  • 63
  • I would prefer these URLs: http://search.cpan.org/perldoc/Net::IP and http://search.cpan.org/perldoc/Net::Netmask – Brad Gilbert Feb 17 '10 at 14:33
  • @Sinan I felt that my answer added enough additional information to be worth posting. The counter question: why -shouldn't- I provide helpful information to the OP? How does it harm anyone? – rjh Feb 18 '10 at 17:04
4

Use Net::IP's looping feature:

The + operator is overloaded in order to allow looping though a whole range of IP addresses:

Sinan Ünür
  • 116,958
  • 15
  • 196
  • 339
3

It's all in how you code it. This is the fastest way I know.

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";
}
Axeman
  • 29,660
  • 2
  • 47
  • 102
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;
}
Sinan Ünür
  • 116,958
  • 15
  • 196
  • 339
ysth
  • 96,171
  • 6
  • 121
  • 214
  • For those too lazy to google it - "Theres More Than One Way To Do It" – Rob Cowell Feb 17 '10 at 11:06
  • Does this method prevent your numbers from exceeding 255? sorry i'm having a hard time reading it, I'm not familiar with unpack and well for some reason all search engines on my netwok seem to be down (can't get to bing, yahoo, or google, in no particular order) – onaclov2000 Feb 17 '10 at 13:19
  • @onaclov2000: perldoc -f pack, perldoc -f unpack, perldoc perlpacktut Yes, it prevents them from exceeding 255. – ysth Feb 17 '10 at 17:08
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);
Thomas
  • 1
  • 1