Здравствуйте Антон,
AVY> Да. Просто Net::CIDR::Lite выполняет операции склеивания соседних
AVY> префиксов одинаковой длинны внутри себя.
Что-то я не понял. Прогнал всю базу через этот модуль и получил точно
такую же базу. Только поменялся поряддок строк. Размер не изменился.
Вот скрипт. На вход принимает геобазу вида:
2.6.190.56/29 GB
3.0.0.0/8 US
4.0.0.0/12 US
4.16.0.0/16 US
4.17.0.0/17 US
4.17.128.0/21 US
4.17.136.0/22 US
4.17.140.0/23 US
а на выходе должен выдавать её же, только со склеенными интервалами.
#!/usr/local/bin/perl -w
use Net::CIDR::Lite;
use strict;
use warnings;
my %countries_hash;
my $country;
my $range;
while (<>) {
chomp;
($range,$country) = split /\s/;
#подсеть каждой страны добавляем в отдельный массив
push @{$countries_hash{$country}}, $range;
}
#цикл по странам
foreach $country (keys %countries_hash) {
#print "$country\n";
my $cidr = Net::CIDR::Lite->new;
#цикл по подсетям страны
foreach $range (@{$countries_hash{$country}}) {
$cidr->add($range);
}
my @cidr_list = $cidr->list;
my $string = join " $country\n",@cidr_list;
print $string,"\n";
$cidr->clean;
undef $cidr;
}
Код кривоват конечно, но что-то мы не так делаем. как была база по
всем странам 2═362═431 байт так столько же в ней байт и осталось.
С уважением,
Михаил Монашёв, SoftSearch.ru
Member of Independent Software Developers Forum (ISDEF)
mailto:postmaster@xxxxxxxxxxxxx
ICQ# 166233339
http://softsearch.ru/
Без бэкапа по жизни.