Here's a script I called "module_list.pl" I wrote it up a while back to do a quick inventory on different systems I maintained. It will give you a sorted list of all modules installed, if you give it a "-v" option it will also show the path to that modules location. Just call it with each version of perl installed and it should do the right thing.
#!/usr/bin/perl
use strict;
use warnings;
=pod
=head1 module_list.pl
prints a list of all available perl modules and their location on disk
=cut
package ModuleLookup;
use File::Find;
use File::Spec;
use Cwd qw(cwd realpath);
=head1 ModuleLookup
Module used by module_list.pl to scan the system for installed perl mo
+dules
=cut
#cached lookups
my %_FILE_TO_CLASSNAME_CACHE;
my %_PATH_CACHE;
#absolute path of all modules in the system
my @ABS_INC = grep { $_ ne cwd() } #remove working directory from p
+ath
map { _cached_rel2abs($_) } @INC;
=head1 $lookup = ModuleLookup->new();
Returns a ModuleLookup object that can be used to find installed perl
+modules
=cut
sub new {
my $class = shift;
my $self = {};
return bless $self, $class;
}
=head1 $modules = $lookup->perl_modules_on_system()
Returns a hash reference containing all perl modules available in the
+current environment keyed by class name
=cut
sub perl_modules_on_system {
my $self = shift;
return $self->perl_modules_in_paths(@ABS_INC);
}
=head1 $modules = $lookup->perl_modules_in_paths(@paths)
Given a list of directory paths, returns a hash reference containing p
+erl modules under those directories keyed by class name
=cut
sub perl_modules_in_paths {
my ( $self, @paths ) = @_;
my %perl_modules;
my @valid_paths;
for my $path (@paths) {
if ( -l $path){
$path = realpath($path);
}
if ( !-d $path ) {
warn("invalid path $path");
next;
}
push @valid_paths, $path;
}
find(
sub {
if ( $File::Find::name =~ /\.pm$/ ) {
my $path = $File::Find::name;
my $class = $self->classname_from_path($path);
$perl_modules{$class} = $path;
}
},
@valid_paths
);
return \%perl_modules;
}
=head1 $classname = $lookup->classname_from_path($path)
Given a path to a perl module, returns the class name expected by B<us
+e>
=cut
sub classname_from_path {
my ( $self, $path ) = @_;
#avoid looking up the same path multiple time (File::Spec::real2abs ca
+n be expensive)
my $full_path = _cached_rel2abs($path);
if ( exists $_FILE_TO_CLASSNAME_CACHE{$full_path} ) {
return $_FILE_TO_CLASSNAME_CACHE{$full_path};
}
my $classpath = $self->classpath_from_fullpath($full_path);
#convert path to module name
( my $classname = $classpath ) =~ s/\.pm//;
$classname =~ s{/}{::}g;
$_FILE_TO_CLASSNAME_CACHE{$full_path} = $classname;
return $classname;
}
=head1 $classpath = $lookup->classpath_from_fullpath($path)
Given a path to a perl module, returns a relative path minus the perl
+include directory
=cut
sub classpath_from_fullpath {
my ( $self, $full_path ) = @_;
#Remove the perl include path from the directory.
my $max_substr = 0;
my $parent_dir;
for my $inc_dir (@ABS_INC) {
my $dir_index = index( $full_path, $inc_dir );
# In the case that one @INC directory is contained within anot
+her
# (i.e. /usr/lib/perl /usr/lib/perl/5.10.0)
# we remove the longest path that matches
if ( $dir_index >= 0 ) {
if ( length($inc_dir) > $max_substr ) {
$max_substr = length($inc_dir);
$parent_dir = $inc_dir;
}
}
}
my $classpath = $full_path;
if ($parent_dir) {
$classpath =~ s{^$parent_dir/}{};
}
return $classpath;
}
sub _cached_rel2abs {
my $path = shift;
if ( !exists $_PATH_CACHE{$path} ) {
my $abs_path = File::Spec->rel2abs($path);
$_PATH_CACHE{$path} = -l $abs_path ? realpath($abs_path) : $ab
+s_path;
}
return $_PATH_CACHE{$path};
}
1;
package main;
use Getopt::Long;
my %opts;
GetOptions( \%opts, 'help','verbose' );
if ( $opts{help} ) {
print <<"EOD";
Usage: $0 - prints a list of all available perl modules and their loca
+tion on disk
For more information: perldoc $0
EOD
exit;
}
my $module_lookup = ModuleLookup->new();
my $modules = $module_lookup->perl_modules_on_system();
#send a simple report to STDOUT
for my $module ( sort { lc($a) cmp lc($b) } keys %$modules ) {
if($opts{verbose}){
printf( "%35s : %-40s\n", $module, $modules->{$module} );
} else {
printf( "%s\n", $module);
}
}
print scalar( keys %$modules ) . " perl modules installed on this syst
+em\n";
1;