我需要在 Perl 中生成 IP 地址 (IPv4) 列表。我有开始和结束地址,例如 1.1.1.1 和 1.10.20.30。如何打印其间的所有地址?
问问题
7680 次
5 回答
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。
于 2010-02-17T13:15:54.563 回答
4
使用Net::IP的循环功能:
+
运算符重载是为了允许在整个 IP 地址范围内循环:
于 2010-02-17T10:34:32.020 回答
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";
}
于 2010-02-17T10:30:24.377 回答
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;
}
于 2010-02-17T10:56:10.767 回答
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);
于 2014-03-29T08:31:09.847 回答