The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl
#
# This program generates the list of registered CPAN sites in perlmodlib.PL
#
use strict;
use warnings;
use 5.14.0;
use autodie;
use HTTP::Tiny;

my $http = HTTP::Tiny->new;

my $url      = 'http://www.cpan.org/SITES';
my $filename = 'SITES';
my $response = $http->mirror( $url, $filename );
unless ( $response->{success} ) {
    die "Error downloading $url";
}

my $fh = IO::File->new($filename);

while ( my $line = <$fh> ) {
    chomp $line;
    last
        if $line eq
            '[Africa] [Asia] [Australasia] [Central America] [Europe] [North America] [South America]';
}

my $line = <$fh>;

say 'Registered CPAN sites';
say '';
say '=for maintainers';
say 'Generated by Porting/make_modlib_cpan.pl';
say '';

my $continent;
my $country;
my $state;

while ( my $line = <$fh> ) {
    chomp $line;
    next if $line =~ /^\s+$/;
    last if $line eq 'Feedback';

    if ( $line =~ /^(?<continent>\w.+)$/ ) {
        if ($continent) {
            say '';
            if ($continent) {
                say "=back";
                say '';
            }
            if ( $continent eq 'North America' ) {
                say "=back";
                say '';
            }
        }
        $continent = $+{continent};
        undef $country;
        say "=head2 $continent";
        say '';
        say '=over 4';
        say '';
    } elsif ( $line =~ /^\s{3}(?<country>\w.+)$/ ) {
        if ($country) {
            say '';
        }
        $country = $+{country};
        undef $state;
        say "=item $country";
        say '';
        if ( $country eq 'United States' ) {
            say '=over 8';
            say '';
        }
    } elsif ( $line =~ /^\s{5}(?<state>\w.+)$/ ) {
        if ($state) {
            say '';
        }
        $state = $+{state};
        say "=item $state";
        say '';
    } elsif ( $line =~ /^\s{22}(?<site>\w.+$)/ ) {
        say "  $+{site}";
    } else {
        die "Unknown line: $line";
    }
}

say '';
say '=back';