Как я могу создать диапазон IP-адресов в Perl? - PullRequest
7 голосов
/ 17 февраля 2010

Мне нужно сформировать список IP-адресов (IPv4) в Perl. У меня есть начальный и конечный адреса, например, 1.1.1.1 и 1.10.20.30. Как я могу напечатать все промежуточные адреса?

Ответы [ 5 ]

7 голосов
/ 17 февраля 2010

Использование 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 .

4 голосов
/ 17 февраля 2010

Использование функции Net :: IP :

Оператор + перегружен, чтобы разрешить зацикливание на всем диапазоне IP-адресов:

3 голосов
/ 17 февраля 2010

Все дело в том, как вы это кодируете. Это самый быстрый способ, который я знаю.

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 голосов
/ 17 февраля 2010

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 голосов
/ 29 марта 2014
# 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);
...