У меня есть список IP-адресов:
238.51.208.96/28
238.51.209.180-199
238.51.209.100-109
238.51.213.2-254
...
Как я могу легко их разобрать? Мне нужен первый и последний IP из диапазона. Для первой строки я могу использовать модуль Net::Netmask CPAN, но что я могу сделать с другими строками?
Как я могу анализировать IP-адреса и диапазоны адресов с помощью Perl?
Ответы (2)
Попробуйте модуль Net::IP
Если второй шаблон не поддерживает, вам может потребоваться внести некоторые изменения в ips заранее, например
238.51.209.180-199
to
238.51.209.180 - 238.51.209.199
с помощью некоторого регулярного выражения, например,
$range =~ s/^((?:\d+\.){3})(\d+)-(\d+)$/$1$2 - $1$3/gm;
Полный сценарий:
use warnings;
use strict;
use Net::IP;
my $range = "238.51.209.180-199";
$range =~ s/^((?:\d+\.){3})(\d+)-(\d+)$/$1$2 - $1$3/;
my $ip = new Net::IP ($range) || die;
print $ip->ip (), "\n";
print $ip->last_ip (), "\n";
person
YOU
schedule
13.04.2010
my $ip = new Net::IP ("238.51.209.180-199") || die;
выход Died at ./andrey-zentavr.pl line 5.
- person ; 13.04.2010
Спасибо. Я также добавил /gm, я думаю, что ему нужен многострочный флаг
- person YOU; 13.04.2010
Я не хочу, чтобы мой сценарий умер. Если Net::IP($range) не работает, мне нужно преобразовать строку в чистый формат.
- person Andrey Zentavr; 13.04.2010
Просто измените сценарий тогда. Это только пример.
- person ; 13.04.2010
Вы можете сопоставлять IP-адреса, используя Regexp::Common::net. package и манипулировать ими (и получать сетевые маски и т. д.) с любым количеством модулей в CPAN, включая Network ::IPv4Addr, NetAddr::IP и Net::CIDR.
person
Ether
schedule
13.04.2010
Я решил использовать smt следующим образом: # Проверяем, какой у нас формат диапазона? if($ipline =~ /^((?:\d+\.){3})(\d+)-(\d+)$/){ $ipline =~ s/^((?:\d+\.) {3})(\d+)-(\d+)$/$1$2 - $1$3/; }
- person Andrey Zentavr; 14.04.2010