#!../miniperl
+use strict;
+use warnings;
+
$ENV{LC_ALL} = 'C';
-open (OUT, ">perlmodlib.tmp") or die $!;
-my (@pragma, @mod, @MANIFEST);
+use FindBin;
+chdir $FindBin::Bin or die "$0: Can't chdir $FindBin::Bin: $!";
+
+my $Quiet = @ARGV && $ARGV[0] eq '-q';
+
+open (OUT, ">perlmodlib.pod") or die $!;
+my (@pragma, @mod, @files);
+
+# MANIFEST itself is Unix style filenames, so we have to assume that Unix style
+# filenames will work.
open (MANIFEST, "../MANIFEST") or die $!;
-@MANIFEST = grep !m</(?:t|demo)/>, <MANIFEST>;
-push @MANIFEST, 'lib/Config.pod', 'lib/Errno.pm', 'lib/lib.pm',
- 'lib/DynaLoader.pm', 'lib/XSLoader.pm';
-
-for (@MANIFEST) {
- my $filename;
- next unless s|^lib/|| or m|^ext/|;
- my ($origfilename) = ($filename) = m|^(\S+)|;
- $filename =~ s|^[^/]+/|| if $filename =~ s|^ext/||;
- next unless $filename =~ m!\.p(m|od)$!;
- unless (open (MOD, "../lib/$filename")) {
- unless (open (MOD, "../$origfilename")) {
- warn "Couldn't open ../$origfilename: $!";
- next;
+@files = grep m#(?:\.pm|\.pod|_pm\.PL)#, map {s/\s.*//s; $_}
+ grep {m#^lib# || m#^ext#} grep !m#/(?:t|demo)/#, <MANIFEST>;
+
+my %exceptions = (
+ 'abbrev' => 'Text::Abbrev',
+ 'carp' => 'Carp',
+ 'getopt' => 'Getopt::Std',
+ 'B<CGI::Carp>' => 'CGI::Carp',
+ 'ModuleInfo' => 'Module::Build::ModuleInfo',
+ '$notes_name' => 'Module::Build::Notes',
+ 'Encode::MIME::NAME' => 'Encode::MIME::Name',
+ 'libnetFAQ' => 'Net::libnetFAQ',
+);
+
+for my $filename (@files) {
+ unless (open MOD, '<', "../$filename") {
+ warn "Couldn't open ../$filename: $!";
+ next;
+ }
+
+ my ($name, $thing);
+ my $foundit = 0;
+ {
+ local $/ = "";
+ while (<MOD>) {
+ next unless /^=head1 NAME/;
+ $foundit++;
+ last;
}
- $filename = $origfilename;
- }
-
-
- my ($name, $thing);
- my $foundit=0;
- {
- local $/="";
- while (<MOD>) {
- next unless /^=head1 NAME/;
- $foundit++;
- last;
- }
- }
- unless ($foundit) {
- warn "$filename missing =head1 NAME (okay if there is respective .pod)\n";
- next;
- }
- my $title = <MOD>;
- chomp($title);
- close MOD;
-
- my $perlname = $filename;
- $perlname =~ s!^.*\b(ext|lib)/!!;
- $perlname =~ s!\.p(m|od)$!!;
- $perlname =~ s!\b(\w+)/\1\b!$1!;
- $perlname =~ s!/!::!g;
-
- ($name, $thing) = split / --? /, $title, 2;
-
- unless ($name and $thing) {
- warn "$filename missing name\n" unless $name;
- warn "$filename missing thing\n" unless $thing;
- next;
- }
-
-
- $thing =~ s/^perl pragma to //i;
- $thing = ucfirst($thing);
- $title = "=item $perlname\n\n$thing\n\n";
-
- if ($filename =~ /[A-Z]/) {
- push @mod, $title;
- } else {
- push @pragma, $title;
- }
+ }
+ unless ($foundit) {
+ warn "$filename missing =head1 NAME (OK if respective .pod exists)\n"
+ unless $Quiet;
+ next;
+ }
+ my $title = <MOD>;
+ chomp $title;
+ close MOD;
+
+ ($name, $thing) = split / --? /, $title, 2;
+
+ unless ($name and $thing) {
+ warn "$filename missing name\n" unless $name;
+ warn "$filename missing thing\n" unless $thing or $Quiet;
+ next;
+ }
+
+ $name =~ s/[^A-Za-z0-9_:\$<>].*//;
+ $name = $exceptions{$name} || $name;
+ $thing =~ s/^perl pragma to //i;
+ $thing = ucfirst $thing;
+ $title = "=item $name\n\n$thing\n\n";
+
+ if ($name =~ /[A-Z]/) {
+ push @mod, $title;
+ } else {
+ push @pragma, $title;
+ }
}
+# Much easier to special case it like this than special case the depending on
+# and parsing lib/Config.pod, or special case opening configpm and finding its
+# =head1 (which is not found with the $/="" above)
+push @mod, <<'CONFIG';
+=item Config
+
+Access Perl configuration information
+
+CONFIG
+
print OUT <<'EOF';
=for maintainers
Generated by perlmodlib.PL -- DO NOT EDIT!
To find out I<all> modules installed on your system, including
those without documentation or outside the standard release,
-just do this:
+just use the following command (under the default win32 shell,
+double quotes should be used instead of single quotes).
- % find `perl -Te 'print "@INC"'` -name '*.pm' -print
+ % perl -MFile::Find=find -MFile::Spec::Functions -Tlwe \
+ 'find { wanted => sub { print canonpath $_ if /\.pm\z/ },
+ no_chdir => 1 }, @INC'
(The -T is here to prevent '.' from being listed in @INC.)
They should all have their own documentation installed and accessible
=back
-The list of the registered CPAN sites as of this writing follows.
+The list of the registered CPAN sites follows.
Please note that the sorting order is alphabetical on fields:
Continent
and thus the North American servers happen to be listed between the
European and the South American sites.
-You should try to choose one close to you.
+Registered CPAN sites
=head2 Africa
=item South Africa
- ftp://ftp.is.co.za/programming/perl/CPAN/
- ftp://ftp.mweb.co.za/pub/mirrors/cpan/
+ http://cpan.mirror.ac.za/
+ ftp://cpan.mirror.ac.za/
+ http://mirror.is.co.za/pub/cpan/
+ ftp://ftp.is.co.za/pub/cpan/
ftp://ftp.saix.net/pub/CPAN/
- ftp://ftp.sun.ac.za/CPAN/CPAN/
=back
=over 4
-=item China
+=item Hong Kong
- ftp://freesoft.cei.gov.cn/pub/languages/perl/CPAN/
- http://www2.linuxforum.net/mirror/CPAN/
- http://cpan.shellhung.org/
- ftp://ftp.shellhung.org/pub/CPAN
+ http://ftp.cuhk.edu.hk/pub/packages/perl/CPAN/
+ ftp://ftp.cuhk.edu.hk/pub/packages/perl/CPAN/
+ http://mirrors.geoexpat.com/cpan/
=item India
- http://cpan.in.freeos.com
- ftp://cpan.in.freeos.com/pub/CPAN/
+ http://perlmirror.indialinks.com/
=item Indonesia
- http://cpan.itb.web.id/
- ftp://mirrors.piksi.itb.ac.id/CPAN/
- http://cpan.cbn.net.id/
- ftp://ftp.cbn.net.id/mirror/CPAN
- http://CPAN.mweb.co.id/
- ftp://ftp.mweb.co.id/pub/languages/perl/CPAN/
-
-=item Israel
-
- http://www.iglu.org.il:/pub/CPAN/
- ftp://ftp.iglu.org.il/pub/CPAN/
- http://cpan.lerner.co.il/
- http://bioinfo.weizmann.ac.il/pub/software/perl/CPAN/
- ftp://bioinfo.weizmann.ac.il/pub/software/perl/CPAN/
+ http://cpan.biz.net.id/
+ http://komo.vlsm.org/CPAN/
+ ftp://komo.vlsm.org/CPAN/
+ http://cpan.pesat.net.id/
+ http://mirror.unej.ac.id/cpan/
+ ftp://mirror.unej.ac.id/cpan/
=item Japan
ftp://ftp.u-aizu.ac.jp/pub/CPAN
- ftp://ftp.kddlabs.co.jp/CPAN/
- http://mirror.nucba.ac.jp/mirror/Perl/
- ftp://mirror.nucba.ac.jp/mirror/Perl/
- ftp://ftp.meisei-u.ac.jp/pub/CPAN/
- ftp://ftp.ayamura.org/pub/CPAN/
- ftp://ftp.jaist.ac.jp/pub/lang/perl/CPAN/
+ ftp://ftp.kddilabs.jp/CPAN/
+ http://ftp.nara.wide.ad.jp/pub/CPAN/
+ ftp://ftp.nara.wide.ad.jp/pub/CPAN/
+ http://ftp.jaist.ac.jp/pub/CPAN/
+ ftp://ftp.jaist.ac.jp/pub/CPAN/
ftp://ftp.dti.ad.jp/pub/lang/CPAN/
ftp://ftp.ring.gr.jp/pub/lang/perl/CPAN/
+ http://ftp.riken.jp/lang/CPAN/
+ ftp://ftp.riken.jp/lang/CPAN/
+ http://ftp.yz.yamagata-u.ac.jp/pub/lang/cpan/
+ ftp://ftp.yz.yamagata-u.ac.jp/pub/lang/cpan/
-=item Korea
-
- http://mirror.Mazic.org/pub/CPAN
- ftp://mirror.Mazic.org/pub/CPAN
+=item Kazakhstan
-=item Philippines
+ http://mirror.linuxiso.kz/CPAN/
- http://www.adzu.edu.ph/CPAN
+=item Republic of Korea
-=item Russian Federation
+ http://ftp.kaist.ac.kr/pub/CPAN
+ ftp://ftp.kaist.ac.kr/pub/CPAN
+ http://cpan.mirror.cdnetworks.com/
+ ftp://cpan.mirror.cdnetworks.com/CPAN/
+ http://cpan.sarang.net/
+ ftp://cpan.sarang.net/CPAN/
- http://cpan.tomsk.ru
- ftp://cpan.tomsk.ru/pub/CPAN
-
-=item Saudi Arabia
+=item Russia
- ftp://ftp.isu.net.sa/pub/CPAN/
+ http://cpan.tomsk.ru/
+ ftp://cpan.tomsk.ru/
=item Singapore
- http://cpan.hjc.edu.sg
http://mirror.averse.net/pub/CPAN
ftp://mirror.averse.net/pub/CPAN
-
-=item South Korea
-
- http://CPAN.bora.net/
- ftp://ftp.bora.net/pub/CPAN/
- http://ftp.kornet.net/pub/CPAN/
- ftp://ftp.kornet.net/pub/CPAN/
- ftp://ftp.nuri.net/pub/CPAN/
- http://ftp.xgate.co.kr/cpan/
- ftp://ftp.xgate.co.kr/pub/mirror/CPAN
+ http://cpan.mirror.choon.net/
+ http://cpan.oss.eznetsols.org
+ ftp://ftp.oss.eznetsols.org/cpan
=item Taiwan
- ftp://ftp.nctu.edu.tw/UNIX/perl/CPAN
- ftp://ftp.ee.ncku.edu.tw/pub/perl/CPAN/
- ftp://ftp1.sinica.edu.tw/pub1/perl/CPAN/
- http://ftp.tku.edu.tw/pub/CPAN/
- ftp://ftp.tku.edu.tw/pub/CPAN/
+ http://ftp.cse.yzu.edu.tw/pub/CPAN/
+ ftp://ftp.cse.yzu.edu.tw/pub/CPAN/
+ http://cpan.nctu.edu.tw/
+ ftp://cpan.nctu.edu.tw/
+ ftp://ftp.ncu.edu.tw/CPAN/
+ http://cpan.cdpa.nsysu.edu.tw/
+ ftp://cpan.cdpa.nsysu.edu.tw/Unix/Lang/CPAN/
+ http://cpan.stu.edu.tw
+ ftp://ftp.stu.edu.tw/CPAN
+ http://ftp.stu.edu.tw/CPAN
+ ftp://ftp.stu.edu.tw/pub/CPAN
+ http://cpan.cs.pu.edu.tw/
+ ftp://cpan.cs.pu.edu.tw/pub/CPAN
=item Thailand
- ftp://ftp.loxinfo.co.th/pub/cpan/
- ftp://ftp.cs.riubon.ac.th/pub/mirrors/CPAN/
+ http://mirrors.issp.co.th/cpan/
+ ftp://mirrors.issp.co.th/cpan/
+
+=item Turkey
+
+ http://cpan.gazi.edu.tr/
+ http://cpan.ulak.net.tr
+ ftp://ftp.ulak.net.tr/pub/CPAN
+
+=item Viet Nam
+
+ http://mirror-fpt-telecom.fpt.net/cpan/
+ ftp://mirror-fpt-telecom.fpt.net/cpan/
=back
=item Costa Rica
- ftp://ftp.linux.co.cr/mirrors/CPAN/
- http://ftp.ucr.ac.cr/Unix/CPAN/
- ftp://ftp.ucr.ac.cr/pub/Unix/CPAN/
+ http://mirrors.ucr.ac.cr/CPAN/
+ ftp://mirrors.ucr.ac.cr/CPAN/
=back
=item Austria
- ftp://ftp.tuwien.ac.at/pub/CPAN/
+ http://cpan.inode.at/
+ ftp://cpan.inode.at
+ http://gd.tuwien.ac.at/languages/perl/CPAN/
+ ftp://gd.tuwien.ac.at/pub/CPAN/
=item Belgium
+ http://ftp.belnet.be/mirror/ftp.cpan.org/
+ ftp://ftp.belnet.be/mirror/ftp.cpan.org/
http://ftp.easynet.be/pub/CPAN/
- ftp://ftp.easynet.be/pub/CPAN/
- http://cpan.skynet.be
- ftp://ftp.skynet.be/pub/CPAN
- ftp://ftp.kulnet.kuleuven.ac.be/pub/mirror/CPAN/
+ http://cpan.weepee.org/
+ http://cpan.fluoline.net/
+
+=item Bosnia and Herzegovina
+
+ http://cpan.blic.net/
=item Bulgaria
- http://cpan.lirex.net/
- ftp://ftp.lirex.net/pub/mirrors/CPAN
+ http://cpan.cbox.biz/
+ ftp://cpan.cbox.biz/cpan/
+ http://cpan.digsys.bg/
+ ftp://ftp.digsys.bg/pub/CPAN
=item Croatia
- http://ftp.linux.hr/pub/CPAN/
- ftp://ftp.linux.hr/pub/CPAN/
+ http://ftp.carnet.hr/pub/CPAN/
+ ftp://ftp.carnet.hr/pub/CPAN/
=item Czech Republic
- http://ftp.fi.muni.cz/pub/CPAN/
ftp://ftp.fi.muni.cz/pub/CPAN/
- ftp://sunsite.mff.cuni.cz/MIRRORS/ftp.funet.fi/pub/languages/perl/CPAN/
+ http://archive.cpan.cz/
=item Denmark
- http://mirrors.sunsite.dk/cpan/
- ftp://sunsite.dk/mirrors/cpan/
- http://cpan.cybercity.dk
- http://www.cpan.dk/CPAN/
- ftp://www.cpan.dk/ftp.cpan.org/CPAN/
-
-=item Estonia
-
- ftp://ftp.ut.ee/pub/languages/perl/CPAN/
+ http://mirrors.dotsrc.org/cpan
+ ftp://mirrors.dotsrc.org/cpan/
+ http://www.cpan.dk/
+ http://mirror.uni-c.dk/pub/CPAN/
=item Finland
ftp://ftp.funet.fi/pub/languages/perl/CPAN/
- http://cpan.kpnqwest.fi/
+ http://mirror.eunet.fi/CPAN
=item France
- http://ftp.u-paris10.fr/perl/CPAN
- ftp://ftp.u-paris10.fr/perl/CPAN
- http://cpan.mirrors.easynet.fr/
- ftp://cpan.mirrors.easynet.fr/pub/ftp.cpan.org/
- ftp://ftp.club-internet.fr/pub/perl/CPAN/
- http://fr.cpan.org/
+ http://cpan.enstimac.fr/
+ ftp://ftp.inria.fr/pub/CPAN/
+ http://distrib-coffee.ipsl.jussieu.fr/pub/mirrors/cpan/
+ ftp://distrib-coffee.ipsl.jussieu.fr/pub/mirrors/cpan/
ftp://ftp.lip6.fr/pub/perl/CPAN/
- ftp://ftp.oleane.net/pub/mirrors/CPAN/
- ftp://ftp.pasteur.fr/pub/computing/CPAN/
http://mir2.ovh.net/ftp.cpan.org
ftp://mir1.ovh.net/ftp.cpan.org
+ http://cpan.miroir-francais.fr/
+ ftp://miroir-francais.fr/pub/cpan/
+ ftp://ftp.oleane.net/pub/CPAN/
+ http://ftp.crihan.fr/mirrors/ftp.cpan.org/
+ ftp://ftp.crihan.fr/mirrors/ftp.cpan.org/
http://ftp.u-strasbg.fr/CPAN
ftp://ftp.u-strasbg.fr/CPAN
http://cpan.cict.fr/
ftp://cpan.cict.fr/pub/CPAN/
- ftp://ftp.uvsq.fr/pub/perl/CPAN/
=item Germany
- ftp://ftp.rz.ruhr-uni-bochum.de/pub/CPAN/
+ ftp://ftp.fu-berlin.de/unix/languages/perl/
+ http://mirrors.softliste.de/cpan/
+ ftp://ftp.rub.de/pub/CPAN/
+ http://www.planet-elektronik.de/CPAN/
+ http://ftp.hosteurope.de/pub/CPAN/
+ ftp://ftp.hosteurope.de/pub/CPAN/
+ http://www.mirrorspace.org/cpan/
+ http://mirror.netcologne.de/cpan/
+ ftp://mirror.netcologne.de/cpan/
ftp://ftp.freenet.de/pub/ftp.cpan.org/pub/CPAN/
- ftp://ftp.uni-erlangen.de/pub/source/CPAN/
- ftp://ftp-stud.fht-esslingen.de/pub/Mirrors/CPAN
- http://pandemonium.tiscali.de/pub/CPAN/
- ftp://pandemonium.tiscali.de/pub/CPAN/
+ http://ftp-stud.hs-esslingen.de/pub/Mirrors/CPAN/
+ ftp://ftp-stud.hs-esslingen.de/pub/Mirrors/CPAN/
+ http://mirrors.zerg.biz/cpan/
http://ftp.gwdg.de/pub/languages/perl/CPAN/
ftp://ftp.gwdg.de/pub/languages/perl/CPAN/
- ftp://ftp.uni-hamburg.de/pub/soft/lang/perl/CPAN/
- ftp://ftp.leo.org/pub/CPAN/
+ http://dl.ambiweb.de/mirrors/ftp.cpan.org/
+ http://cpan.mirror.clusters.kg/
+ http://cpan.mirror.iphh.net/
+ ftp://cpan.mirror.iphh.net/pub/CPAN/
+ http://cpan.mirroring.de/
+ http://mirror.informatik.uni-mannheim.de/pub/mirrors/CPAN/
+ ftp://mirror.informatik.uni-mannheim.de/pub/mirrors/CPAN/
+ http://ftp.cw.net/pub/CPAN/
+ ftp://ftp.cw.net/pub/CPAN/
+ http://cpan.cpantesters.org/
+ ftp://cpan.cpantesters.org/CPAN/
+ http://cpan.mirrored.de/
+ ftp://mirror.petamem.com/CPAN/
http://cpan.noris.de/
ftp://cpan.noris.de/pub/CPAN/
ftp://ftp.mpi-sb.mpg.de/pub/perl/CPAN/
=item Greece
- ftp://ftp.acn.gr/pub/lang/perl/CPAN
ftp://ftp.forthnet.gr/pub/languages/perl/CPAN
ftp://ftp.ntua.gr/pub/lang/perl/
+ http://cpan.cc.uoc.gr/
+ ftp://ftp.cc.uoc.gr/mirrors/CPAN/
=item Hungary
- http://cpan.artifact.hu/
- ftp://cpan.artifact.hu/CPAN/
- http://ftp.kfki.hu/packages/perl/CPAN/
- ftp://ftp.kfki.hu/pub/packages/perl/CPAN/
+ http://cpan.mirrors.enexis.hu/
+ ftp://cpan.mirrors.enexis.hu/mirrors/cpan/
+ http://cpan.hu/
=item Iceland
=item Ireland
- http://cpan.indigo.ie/
- ftp://cpan.indigo.ie/pub/CPAN/
- http://sunsite.compapp.dcu.ie/pub/perl/
- ftp://sunsite.compapp.dcu.ie/pub/perl/
+ http://ftp.esat.net/pub/languages/perl/CPAN/
+ ftp://ftp.esat.net/pub/languages/perl/CPAN/
+ http://ftp.heanet.ie/mirrors/ftp.perl.org/pub/CPAN
+ ftp://ftp.heanet.ie/mirrors/ftp.perl.org/pub/CPAN
=item Italy
- http://cpan.nettuno.it/
- http://gusp.dyndns.org/CPAN/
- ftp://gusp.dyndns.org/pub/CPAN
- http://softcity.iol.it/cpan
- ftp://softcity.iol.it/pub/cpan
- ftp://ftp.unina.it/pub/Other/CPAN/CPAN/
- ftp://ftp.unipi.it/pub/mirror/perl/CPAN/
- ftp://cis.uniRoma2.it/CPAN/
- ftp://ftp.edisontel.it/pub/CPAN_Mirror/
- ftp://ftp.flashnet.it/pub/CPAN/
+ http://bo.mirror.garr.it/mirrors/CPAN/
+ http://cpan.panu.it/
+ ftp://ftp.panu.it/pub/mirrors/perl/CPAN/
+ http://cpan.fastbull.org/
=item Latvia
=item Lithuania
- ftp://ftp.unix.lt/pub/CPAN/
+ http://ftp.litnet.lt/pub/CPAN/
+ ftp://ftp.litnet.lt/pub/CPAN/
+
+=item Malta
+
+ http://cpan.waldonet.net.mt/
=item Netherlands
+ ftp://ftp.quicknet.nl/pub/CPAN/
+ http://mirror.hostfuss.com/CPAN/
+ ftp://mirror.hostfuss.com/CPAN/
+ http://mirrors3.kernel.org/cpan/
+ ftp://mirrors3.kernel.org/pub/CPAN/
+ http://cpan.osmirror.nl/
+ ftp://ftp.osmirror.nl/pub/cpan/
+ http://cpan.mirror.versatel.nl/
+ ftp://ftp.mirror.versatel.nl/cpan/
ftp://download.xs4all.nl/pub/mirror/CPAN/
- ftp://ftp.nl.uu.net/pub/CPAN/
- ftp://ftp.nluug.nl/pub/languages/perl/CPAN/
- http://cpan.cybercomm.nl/
- ftp://mirror.cybercomm.nl/pub/CPAN
+ http://mirror.leaseweb.com/CPAN/
+ ftp://mirror.leaseweb.com/CPAN/
ftp://ftp.cpan.nl/pub/CPAN/
- http://ftp.easynet.nl/mirror/CPAN
- ftp://ftp.easynet.nl/mirror/CPAN
http://archive.cs.uu.nl/mirror/CPAN/
ftp://ftp.cs.uu.nl/mirror/CPAN/
+ http://https://luxitude.net/cpan/
=item Norway
=item Poland
- ftp://ftp.pk.edu.pl/pub/lang/perl/CPAN/
- ftp://ftp.mega.net.pl/pub/mirrors/ftp.perl.com/
- ftp://ftp.man.torun.pl/pub/doc/CPAN/
+ http://mirror.icis.pcz.pl/CPAN/
+ ftp://mirror.icis.pcz.pl/CPAN/
+ http://piotrkosoft.net/pub/mirrors/CPAN/
+ ftp://ftp.piotrkosoft.net/pub/mirrors/CPAN/
+ http://ftp.man.poznan.pl/pub/CPAN
+ ftp://ftp.man.poznan.pl/pub/CPAN
ftp://sunsite.icm.edu.pl/pub/CPAN/
+ ftp://ftp.tpnet.pl/d4/CPAN/
=item Portugal
- ftp://ftp.ua.pt/pub/CPAN/
- ftp://perl.di.uminho.pt/pub/CPAN/
http://cpan.dei.uc.pt/
ftp://ftp.dei.uc.pt/pub/CPAN
ftp://ftp.ist.utl.pt/pub/CPAN/
+ http://cpan.perl.pt/
http://cpan.ip.pt/
ftp://cpan.ip.pt/pub/cpan/
- ftp://ftp.netc.pt/pub/CPAN/
- ftp://ftp.up.pt/pub/CPAN
+ http://mirrors.nfsi.pt/CPAN/
+ ftp://mirrors.nfsi.pt/pub/CPAN/
+ http://cpan.dcc.fc.up.pt/
=item Romania
- ftp://ftp.kappa.ro/pub/mirrors/ftp.perl.org/pub/CPAN/
- ftp://ftp.dntis.ro/pub/cpan/
- ftp://ftp.dnttm.ro/pub/CPAN/
- ftp://ftp.lasting.ro/pub/CPAN
- ftp://ftp.timisoara.roedu.net/mirrors/CPAN/
+ http://ftp.astral.ro/pub/CPAN/
+ ftp://ftp.astral.ro/pub/CPAN/
+ ftp://ftp.lug.ro/CPAN
+ http://mirrors.xservers.ro/CPAN/
+ http://mirrors.hostingromania.ro/ftp.cpan.org/
+ ftp://ftp.hostingromania.ro/mirrors/ftp.cpan.org/
+ ftp://ftp.iasi.roedu.net/pub/mirrors/ftp.cpan.org/
+ ftp://ftp.ambra.ro/pub/CPAN
=item Russia
- ftp://ftp.chg.ru/pub/lang/perl/CPAN/
+ ftp://ftp.aha.ru/CPAN/
http://cpan.rinet.ru/
ftp://cpan.rinet.ru/pub/mirror/CPAN/
- ftp://ftp.aha.ru/pub/CPAN/
- http://cpan.sai.msu.ru/
- ftp://ftp.sai.msu.su/pub/lang/perl/CPAN/
+ ftp://ftp.SpringDaemons.com/pub/CPAN/
+ http://cpan.nx1.ru/
+ ftp://cpan.nx1.ru/
+ http://mirror.rol.ru/CPAN/
+ http://ftp.silvernet.ru/CPAN/
+ http://ftp.spbu.ru/CPAN/
+ ftp://ftp.spbu.ru/CPAN/
=item Slovakia
- http://ftp.cvt.stuba.sk/pub/CPAN/
- ftp://ftp.cvt.stuba.sk/pub/CPAN/
+ http://cpan.fyxm.net/
=item Slovenia
- ftp://ftp.arnes.si/software/perl/CPAN/
+ http://www.klevze.si/cpan
=item Spain
- http://cpan.imasd.elmundo.es/
+ http://osl.ugr.es/CPAN/
ftp://ftp.rediris.es/mirror/CPAN/
- ftp://ftp.etse.urv.es/pub/perl/
+ http://ftp.gui.uva.es/sites/cpan.org/
+ ftp://ftp.gui.uva.es/sites/cpan.org/
=item Sweden
- http://ftp.du.se/CPAN/
- ftp://ftp.du.se/pub/CPAN/
- ftp://mirror.dataphone.se/pub/CPAN
- ftp://ftp.sunet.se/pub/lang/perl/CPAN/
+ http://mirrors4.kernel.org/cpan/
+ ftp://mirrors4.kernel.org/pub/CPAN/
=item Switzerland
- ftp://ftp.danyk.ch/CPAN/
- ftp://sunsite.cnlab-switch.ch/mirror/CPAN/
-
-=item Turkey
-
- http://ftp.ulak.net.tr/perl/CPAN/
- ftp://ftp.ulak.net.tr/perl/CPAN
- ftp://sunsite.bilkent.edu.tr/pub/languages/CPAN/
+ http://cpan.mirror.solnet.ch/
+ ftp://ftp.solnet.ch/mirror/CPAN/
+ http://mirror.switch.ch/ftp/mirror/CPAN/
+ ftp://mirror.switch.ch/mirror/CPAN/
=item Ukraine
+ http://cpan.makeperl.org/
+ ftp://cpan.makeperl.org/pub/CPAN
http://cpan.org.ua/
- ftp://cpan.org.ua/
- ftp://ftp.perl.org.ua/pub/CPAN/
+ http://no-more.kiev.ua/CPAN/
+ ftp://no-more.kiev.ua/pub/CPAN/
+ http://cpan.gafol.net/
+ ftp://ftp.gafol.net/pub/cpan/
=item United Kingdom
- http://www.mirror.ac.uk/sites/ftp.funet.fi/pub/languages/perl/CPAN
- ftp://ftp.mirror.ac.uk/sites/ftp.funet.fi/pub/languages/perl/CPAN/
- http://cpan.teleglobe.net/
- ftp://cpan.teleglobe.net/pub/CPAN
- http://cpan.crazygreek.co.uk
+ http://www.mirrorservice.org/sites/ftp.funet.fi/pub/languages/perl/CPAN/
+ ftp://ftp.mirrorservice.org/sites/ftp.funet.fi/pub/languages/perl/CPAN/
+ http://mirror.tje.me.uk/pub/mirrors/ftp.cpan.org/
+ ftp://mirror.tje.me.uk/pub/mirrors/ftp.cpan.org/
+ http://www.mirror.8086.net/sites/CPAN/
+ ftp://ftp.mirror.8086.net/sites/CPAN/
+ http://cpan.mirror.anlx.net/
+ ftp://ftp.mirror.anlx.net/CPAN/
+ http://mirror.bytemark.co.uk/CPAN/
+ ftp://mirror.bytemark.co.uk/CPAN/
+ http://cpan.etla.org/
+ ftp://cpan.etla.org/pub/CPAN
ftp://ftp.demon.co.uk/pub/CPAN/
- http://cpan.m.flirble.org/
- ftp://ftp.flirble.org/pub/languages/perl/CPAN/
- ftp://ftp.plig.org/pub/CPAN/
- http://mirror.uklinux.net/CPAN/
- ftp://mirror.uklinux.net/pub/CPAN/
- http://cpan.mirrors.clockerz.net/
- ftp://ftp.clockerz.net/pub/CPAN/
- ftp://usit.shef.ac.uk/pub/packages/CPAN/
+ http://mirror.sov.uk.goscomb.net/CPAN/
+ ftp://mirror.sov.uk.goscomb.net/pub/CPAN/
+ http://ftp.plig.net/pub/CPAN/
+ ftp://ftp.plig.net/pub/CPAN/
+ http://ftp.ticklers.org/pub/CPAN/
+ ftp://ftp.ticklers.org/pub/CPAN/
+ http://cpan.mirrors.uk2.net/
+ ftp://mirrors.uk2.net/pub/CPAN/
+ http://mirror.ox.ac.uk/sites/www.cpan.org/
+ ftp://mirror.ox.ac.uk/sites/www.cpan.org/
=back
=over 4
-=item Alberta
+=item Bahamas
- http://sunsite.ualberta.ca/pub/Mirror/CPAN/
- ftp://sunsite.ualberta.ca/pub/Mirror/CPAN/
+ http://www.securehost.com/mirror/CPAN/
-=item Manitoba
+=item Canada
+ http://cpan.justanotherperlhacker.com/pub/CPAN/
+ ftp://cpan.justanotherperlhacker.com/pub/CPAN/
+ http://cpan.arcticnetwork.ca
+ ftp://mirror.arcticnetwork.ca/pub/CPAN
+ http://cpan.sunsite.ualberta.ca/
+ ftp://cpan.sunsite.ualberta.ca/pub/CPAN/
http://theoryx5.uwinnipeg.ca/pub/CPAN/
ftp://theoryx5.uwinnipeg.ca/pub/CPAN/
-
-=item Nova Scotia
-
- ftp://cpan.chebucto.ns.ca/pub/CPAN/
-
-=item Ontario
-
- ftp://ftp.crc.ca/pub/CPAN/
-
-=item Quebec
-
- http://cpan.mirror.smartworker.org/
+ http://arwen.cs.dal.ca/mirror/CPAN/
+ ftp://arwen.cs.dal.ca/pub/mirror/CPAN/
+ http://CPAN.mirror.rafal.ca/
+ ftp://CPAN.mirror.rafal.ca/pub/CPAN/
+ ftp://ftp.nrc.ca/pub/CPAN/
+ http://mirror.csclub.uwaterloo.ca/pub/CPAN/
+ ftp://mirror.csclub.uwaterloo.ca/pub/CPAN/
=item Mexico
- http://cpan.azc.uam.mx
- ftp://cpan.azc.uam.mx/mirrors/CPAN
- http://cpan.unam.mx/
- ftp://cpan.unam.mx/pub/CPAN
http://www.msg.com.mx/CPAN/
ftp://ftp.msg.com.mx/pub/CPAN/
-=back
-
-=head2 United States
+=item United States
-=over 4
+=over 8
=item Alabama
=item California
+ http://cpan.knowledgematters.net/
+ http://cpan.binkerton.com/
http://cpan.develooper.com/
- http://www.cpan.org/
- ftp://cpan.valueclick.com/pub/CPAN/
http://mirrors.gossamer-threads.com/CPAN
- ftp://cpan.nas.nasa.gov/pub/perl/CPAN/
+ http://cpan.schatt.com/
http://mirrors.kernel.org/cpan/
ftp://mirrors.kernel.org/pub/CPAN
- http://cpan.digisle.net/
- ftp://cpan.digisle.net/pub/CPAN
+ http://mirrors2.kernel.org/cpan/
+ ftp://mirrors2.kernel.org/pub/CPAN/
+ http://cpan.mirrors.redwire.net/
+ http://cpan.mirror.facebook.net/
+ http://mirrors1.kernel.org/cpan/
+ ftp://mirrors1.kernel.org/pub/CPAN/
+ http://cpan-sj.viaverio.com/
+ ftp://cpan-sj.viaverio.com/pub/CPAN/
http://www.perl.com/CPAN/
- http://download.sourceforge.net/mirrors/CPAN/
-
-=item Colorado
-
- ftp://ftp.cs.colorado.edu/pub/perl/CPAN/
-
-=item Delaware
-
- http://ftp.lug.udel.edu/pub/CPAN
- ftp://ftp.lug.udel.edu/pub/CPAN
-
-=item District of Columbia
-
- ftp://ftp.dc.aleron.net/pub/CPAN/
+ http://cpan.yahoo.com/
=item Florida
ftp://ftp.cise.ufl.edu/pub/mirrors/CPAN/
- http://mirror.csit.fsu.edu/pub/CPAN/
- ftp://mirror.csit.fsu.edu/pub/CPAN/
- http://cpan.mirrors.nks.net/
+ http://mirror.atlantic.net/pub/CPAN/
+ ftp://mirror.atlantic.net/pub/CPAN/
+ http://mirror.candidhosting.com/pub/CPAN
+ ftp://mirror.candidhosting.com/pub/CPAN
+
+=item Idaho
+
+ http://mirror.its.uidaho.edu/pub/cpan/
+ ftp://mirror.its.uidaho.edu/cpan/
=item Illinois
- http://uiarchive.uiuc.edu/mirrors/ftp/cpan.cse.msu.edu/
- ftp://uiarchive.uiuc.edu/mirrors/ftp/cpan.cse.msu.edu/
+ http://cpan.mirrors.hoobly.com/
+ http://cpan.uchicago.edu/pub/CPAN/
+ ftp://cpan.uchicago.edu/pub/CPAN/
+ http://mirrors.servercentral.net/CPAN/
+ http://www.stathy.com/CPAN/
+ ftp://www.stathy.com/CPAN/
=item Indiana
ftp://ftp.uwsg.iu.edu/pub/perl/CPAN/
http://cpan.netnitco.net/
ftp://cpan.netnitco.net/pub/mirrors/CPAN/
- http://archive.progeny.com/CPAN/
- ftp://archive.progeny.com/CPAN/
- ftp://cpan.in-span.net/
- http://csociety-ftp.ecn.purdue.edu/pub/CPAN
- ftp://csociety-ftp.ecn.purdue.edu/pub/CPAN
-
-=item Kentucky
-
- http://cpan.uky.edu/
- ftp://cpan.uky.edu/pub/CPAN/
+ http://ftp.ndlug.nd.edu/pub/perl/
+ ftp://ftp.ndlug.nd.edu/pub/perl/
+ http://fx.saintjoe.edu/pub/CPAN
=item Massachusetts
ftp://ftp.ccs.neu.edu/net/mirrors/ftp.funet.fi/pub/languages/perl/CPAN/
- http://cpan.mirrors.netnumina.com/
- ftp://mirrors.netnumina.com/cpan/
=item Michigan
- ftp://cpan.cse.msu.edu/
+ http://ftp.wayne.edu/cpan/
+ ftp://ftp.wayne.edu/cpan/
+
+=item Minnesota
+
+ http://cpan.msi.umn.edu/
=item New Jersey
- ftp://ftp.cpanel.net/pub/CPAN/
- http://cpan.teleglobe.net/
- ftp://cpan.teleglobe.net/pub/CPAN
+ http://mirror.datapipe.net/CPAN/
+ ftp://mirror.datapipe.net/pub/CPAN/
=item New York
- ftp://ftp.exobit.org/pub/perl/CPAN
+ http://mirrors.24-7-solutions.net/pub/CPAN/
+ ftp://mirrors.24-7-solutions.net/pub/CPAN/
+ http://mirror.cc.columbia.edu/pub/software/cpan/
+ ftp://mirror.cc.columbia.edu/pub/software/cpan/
http://cpan.belfry.net/
- http://cpan.thepirtgroup.com/
- ftp://cpan.thepirtgroup.com/
- ftp://ftp.stealth.net/pub/CPAN/
- http://www.rge.com/pub/languages/perl/
- ftp://ftp.rge.com/pub/languages/perl/
- ftp://mirrors.cloud9.net/pub/mirrors/CPAN/
+ http://cpan.erlbaum.net/
+ ftp://cpan.erlbaum.net/CPAN/
+ http://cpan.hexten.net/
+ ftp://cpan.hexten.net/
+ http://ftp.fxcorporate.com/CPAN/
+ ftp://ftp.fxcorporate.com/pub/CPAN/
+ ftp://mirror.nyi.net/CPAN/
+ http://mirror.rit.edu/CPAN/
+ ftp://mirror.rit.edu/CPAN/
=item North Carolina
- ftp://ftp.duke.edu/pub/perl/
-
-=item Ohio
-
- ftp://ftp.loaded.net/pub/CPAN/
-
-=item Oklahoma
-
- ftp://ftp.ou.edu/mirrors/CPAN/
+ http://www.ibiblio.org/pub/mirrors/CPAN
+ ftp://ftp.ncsu.edu/pub/mirror/CPAN/
=item Oregon
- ftp://ftp.orst.edu/pub/CPAN
+ http://ftp.osuosl.org/pub/CPAN/
+ ftp://ftp.osuosl.org/pub/CPAN/
=item Pennsylvania
http://ftp.epix.net/CPAN/
ftp://ftp.epix.net/pub/languages/perl/
- http://mirrors.phenominet.com/pub/CPAN/
- ftp://mirrors.phenominet.com/pub/CPAN/
http://cpan.pair.com/
ftp://cpan.pair.com/pub/CPAN/
- ftp://carroll.cac.psu.edu/pub/CPAN/
+
+=item South Carolina
+
+ http://cpan.mirror.clemson.edu/
=item Tennessee
- ftp://ftp.sunsite.utk.edu/pub/CPAN/
+ http://mira.sunsite.utk.edu/CPAN/
=item Texas
- http://ftp.sedl.org/pub/mirrors/CPAN/
- ftp://mirror.telentente.com/pub/CPAN
+ http://mirror.uta.edu/CPAN
=item Utah
+ http://cpan.cs.utah.edu
+ ftp://cpan.cs.utah.edu/pub/CPAN/
ftp://mirror.xmission.com/CPAN/
=item Virginia
- http://mirrors.rcn.net/pub/lang/CPAN/
- ftp://mirrors.rcn.net/pub/lang/CPAN/
+ http://cpan-du.viaverio.com/
+ ftp://cpan-du.viaverio.com/pub/CPAN/
http://perl.secsup.org/
ftp://perl.secsup.org/pub/perl/
- http://mirrors.phihost.com/CPAN/
- ftp://mirrors.phihost.com/CPAN/
- ftp://ruff.cs.jmu.edu/pub/CPAN/
- http://perl.Liquidation.com/CPAN/
+ ftp://mirror.cogentco.com/pub/CPAN/
-=item ashington
+=item Washington
http://cpan.llarian.net/
ftp://cpan.llarian.net/pub/CPAN/
- http://cpan.mirrorcentral.com/
- ftp://ftp.mirrorcentral.com/pub/CPAN/
ftp://ftp-mirror.internap.com/pub/CPAN/
=item Wisconsin
+ http://cpan.mirrors.tds.net
+ ftp://cpan.mirrors.tds.net/pub/CPAN
http://mirror.sit.wisc.edu/pub/CPAN/
ftp://mirror.sit.wisc.edu/pub/CPAN/
=back
+=back
+
=head2 Oceania
=over 4
=item Australia
- http://ftp.planetmirror.com/pub/CPAN/
- ftp://ftp.planetmirror.com/pub/CPAN/
- ftp://mirror.aarnet.edu.au/pub/perl/CPAN/
- ftp://cpan.topend.com.au/pub/CPAN/
+ http://mirror.internode.on.net/pub/cpan/
+ ftp://mirror.internode.on.net/pub/cpan/
+ http://cpan.mirror.aussiehq.net.au/
+ http://mirror.as24220.net/cpan/
+ ftp://mirror.as24220.net/cpan/
=item New Zealand
ftp://ftp.auckland.ac.nz/pub/perl/CPAN/
- http://cpan.soa.co.nz/CPAN/
+ http://cpan.inspire.net.nz
+ ftp://cpan.inspire.net.nz/cpan
+ http://cpan.catalyst.net.nz/CPAN/
+ ftp://cpan.catalyst.net.nz/pub/CPAN/
=back
=item Argentina
- ftp://mirrors.bannerlandia.com.ar/mirrors/CPAN/
- http://ftp.fcaglp.unlp.edu.ar/pub/CPAN/
- ftp://ftp.fcaglp.unlp.edu.ar/pub/CPAN/
+ http://cpan.patan.com.ar/
+ http://cpan.localhost.net.ar
+ ftp://mirrors.localhost.net.ar/pub/mirrors/CPAN
=item Brazil
ftp://cpan.pop-mg.com.br/pub/CPAN/
- ftp://ftp.matrix.com.br/pub/perl/CPAN/
+ http://ftp.pucpr.br/CPAN
+ ftp://ftp.pucpr.br/CPAN
+ http://cpan.kinghost.net/
+ ftp://ftp.linorg.usp.br/CPAN
=item Chile
- http://cpan.netglobalis.net/
- ftp://cpan.netglobalis.net/pub/CPAN/
+ http://cpan.dcc.uchile.cl/
+ ftp://cpan.dcc.uchile.cl/pub/lang/cpan/
+
+=item Colombia
+
+ http://www.laqee.unal.edu.co/CPAN/
=back
=head2 RSYNC Mirrors
- ftp.fcaglp.unlp.edu.ar::CPAN
- cpan.mirror.smartworker.org::CPAN
+ mirror.as24220.net::cpan
+ cpan.inode.at::CPAN
+ gd.tuwien.ac.at::CPAN
+ ftp.belnet.be::packages/cpan
+ rsync.linorg.usp.br::CPAN
+ rsync.arcticnetwork.ca::CPAN
+ CPAN.mirror.rafal.ca::CPAN
+ mirror.csclub.uwaterloo.ca::CPAN
theoryx5.uwinnipeg.ca::CPAN
- ftp.shellhung.org::CPAN
- ftp.funet.fi::CPAN
- ftp.u-paris10.fr::CPAN
+ www.laqee.unal.edu.co::CPAN
+ mirror.uni-c.dk::CPAN
+ rsync.nic.funet.fi::CPAN
+ rsync://distrib-coffee.ipsl.jussieu.fr/pub/mirrors/cpan/
mir1.ovh.net::CPAN
+ miroir-francais.fr::cpan
+ ftp.crihan.fr::CPAN
+ rsync://mirror.cict.fr/cpan/
+ rsync://mirror.netcologne.de/cpan/
+ ftp-stud.hs-esslingen.de::CPAN/
ftp.gwdg.de::FTP/languages/perl/CPAN/
- ftp.leo.org::CPAN
- CPAN.piksi.itb.ac.id::CPAN
- ftp.cbn.net.id::CPAN
- ftp.iglu.org.il::CPAN
- gusp.dyndns.org::cpan
- ftp.kddlabs.co.jp::cpan
- ftp.ayamura.org::pub/CPAN/
+ cpan.mirror.iphh.net::CPAN
+ cpan.cpantesters.org::cpan
+ cpan.hu::CPAN
+ komo.vlsm.org::CPAN
+ mirror.unej.ac.id::cpan
+ ftp.esat.net::/pub/languages/perl/CPAN
+ ftp.heanet.ie::mirrors/ftp.perl.org/pub/CPAN
+ rsync.panu.it::CPAN
+ cpan.fastbull.org::CPAN
+ ftp.kddilabs.jp::cpan
+ ftp.nara.wide.ad.jp::cpan/
+ rsync://ftp.jaist.ac.jp/pub/CPAN/
+ rsync://ftp.riken.jp/cpan/
+ mirror.linuxiso.kz::CPAN
+ rsync://mirrors3.kernel.org/mirrors/CPAN/
+ rsync://rsync.osmirror.nl/cpan/
+ mirror.leaseweb.com::CPAN
+ cpan.nautile.nc::CPAN
+ mirror.icis.pcz.pl::CPAN
+ piotrkosoft.net::mirrors/CPAN
+ rsync://cpan.perl.pt/
+ ftp.kaist.ac.kr::cpan
+ cpan.sarang.net::CPAN
mirror.averse.net::cpan
- cpan.teleglobe.net::CPAN
- ftp.sedl.org::cpan
- archive.progeny.com::CPAN
- cpan.teleglobe.net::CPAN
- ftp.lug.udel.edu::cpan
+ rsync.oss.eznetsols.org
+ mirror.ac.za::cpan
+ ftp.is.co.za::IS-Mirror/ftp.cpan.org/
+ rsync://ftp.gui.uva.es/cpan/
+ rsync://mirrors4.kernel.org/mirrors/CPAN/
+ ftp.solnet.ch::CPAN
+ ftp.ulak.net.tr::CPAN
+ gafol.net::cpan
+ rsync.mirrorservice.org::ftp.funet.fi/pub/
+ rsync://rsync.mirror.8086.net/CPAN/
+ rsync.mirror.anlx.net::CPAN
+ mirror.bytemark.co.uk::CPAN
+ ftp.plig.net::CPAN
+ rsync://ftp.ticklers.org:CPAN/
+ mirrors.ibiblio.org::CPAN
+ cpan-du.viaverio.com::CPAN
+ mirror.hiwaay.net::CPAN
+ rsync://mira.sunsite.utk.edu/CPAN/
+ cpan.mirrors.tds.net::CPAN
+ mirror.its.uidaho.edu::cpan
+ rsync://mirror.cc.columbia.edu::cpan/
+ ftp.fxcorporate.com::CPAN
+ rsync.atlantic.net::CPAN
mirrors.kernel.org::mirrors/CPAN
- mirrors.phenominet.com::CPAN
- mirror.csit.fsu.edu::CPAN
- csociety-ftp.ecn.purdue.edu::CPAN
+ rsync://mirrors2.kernel.org/mirrors/CPAN/
+ cpan.pair.com::CPAN
+ rsync://mirror.rit.edu/CPAN/
+ rsync://mirror.facebook.net/cpan/
+ rsync://mirrors1.kernel.org/mirrors/CPAN/
+ cpan-sj.viaverio.com::CPAN
For an up-to-date listing of CPAN sites,
see http://www.cpan.org/SITES or ftp://www.cpan.org/SITES .
Does your module pass the 'empty subclass' test? If you say
C<@SUBCLASS::ISA = qw(YOURCLASS);> your applications should be able
to use SUBCLASS in exactly the same way as YOURCLASS. For example,
-does your application still work if you change: C<$obj = new YOURCLASS;>
-into: C<$obj = new SUBCLASS;> ?
+does your application still work if you change: C<< $obj = YOURCLASS->new(); >>
+into: C<< $obj = SUBCLASS->new(); >> ?
Avoid keeping any state information in your packages. It makes it
difficult for multiple other packages to use yours. Keep state
The general mechanism is to assert your Copyright and then make
a declaration of how others may copy/use/modify your work.
-Perl, for example, is supplied with two types of licence: The GNU
-GPL and The Artistic Licence (see the files README, Copying, and
-Artistic). Larry has good reasons for NOT just using the GNU GPL.
+Perl, for example, is supplied with two types of licence: The GNU GPL
+and The Artistic Licence (see the files README, Copying, and Artistic,
+or L<perlgpl> and L<perlartistic>). Larry has good reasons for NOT
+just using the GNU GPL.
My personal recommendation, out of respect for Larry, Perl, and the
Perl community at large is to state something simply like:
or upload to one of these sites:
https://pause.kbx.de/pause/
- http://pause.perl.org/pause/
+ http://pause.perl.org/
and notify <modules@perl.org>.
EOF
close MANIFEST or warn "$0: failed to close MANIFEST (../MANIFEST): $!";
-close OUT or warn "$0: failed to close OUT (perlmodlib.tmp): $!";
+close OUT or warn "$0: failed to close OUT (perlmodlib.pod): $!";