How can I create a range of IP addresses in Perl?

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

+7
perl ipv4
source share
5 answers

Use Net :: IP :

The + operator is overloaded to allow a loop through a series of IP addresses:

+4
source share

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 since Net :: IP accepts CIDR notation, for example. 193.0.1 / 24, and also supports IPv6.

Edit: If you work with netblocks on purpose, you can explore Net :: Netmask .

+7
source share

Everything is 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"; } 
+3
source share

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; } 
+2
source share
 # 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
source share

All Articles