Как я могу анализировать IP-адреса и диапазоны адресов с помощью Perl?

У меня есть список 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, но что я могу сделать с другими строками?


person Andrey Zentavr    schedule 13.04.2010    source источник


Ответы (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
comment
my $ip = new Net::IP ("238.51.209.180-199") || die; выход Died at ./andrey-zentavr.pl line 5. - person ; 13.04.2010
comment
Спасибо. Я также добавил /gm, я думаю, что ему нужен многострочный флаг - person YOU; 13.04.2010
comment
Я не хочу, чтобы мой сценарий умер. Если Net::IP($range) не работает, мне нужно преобразовать строку в чистый формат. - person Andrey Zentavr; 13.04.2010
comment
Просто измените сценарий тогда. Это только пример. - person ; 13.04.2010

Вы можете сопоставлять IP-адреса, используя Regexp::Common::net. package и манипулировать ими (и получать сетевые маски и т. д.) с любым количеством модулей в CPAN, включая Network ::IPv4Addr, NetAddr::IP и Net::CIDR.

person Ether    schedule 13.04.2010
comment
Я решил использовать smt следующим образом: # Проверяем, какой у нас формат диапазона? if($ipline =~ /^((?:\d+\.){3})(\d+)-(\d+)$/){ $ipline =~ s/^((?:\d+\.) {3})(\d+)-(\d+)$/$1$2 - $1$3/; } - person Andrey Zentavr; 14.04.2010