Я должен генерировать список IP-адресов (IPv4) в Perl. Я имею, запускаются и конечные адреса, например, 1.1.1.1 и 1.10.20.30. Как я могу распечатать весь промежуток адресов?
Используйте функцию циклов Net::IP:
Оператор
+
перегружен для того, чтобы можно было перебрать целый ряд IP-адресов:
Используйте 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 .
Все дело в том, как вы это кодируете. Это самый быстрый способ, который я знаю.
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";
}
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;
}