Module-Extract-Use
view release on metacpan or search on metacpan
examples/extract_modules view on Meta::CPAN
$ extract_modules -0 filename [...]
Getopt::StdModule::CoreListPod::Usageopenstrictwarnings
# print the modules list as JSON
$ extract_modules -j filename [...]
[
"Getopt::Std",
"Module::CoreList",
"Pod::Usage",
"open",
"strict",
"warnings"
]
# print the modules list as a basic cpanfile
# https://metacpan.org/pod/cpanfile
$ extract_modules -c filename [...]
requires 'Getopt::Std', '1.23';
requires 'Module::CoreList';
requires 'Pod::Usage';
requires 'open';
requires 'strict';
requires 'warnings';
# look for the file in PATH
$ extract_modules -b some_program
=head1 DESCRIPTION
This script does not execute the code in the files it examines. It
uses the C<Module::Extract::Use> or C<Module::ExtractUse> modules
which statically analyzes the source without compiling or running it.
These modules cannot discover modules loaded dynamically through a
string eval.
=head2 Command-line options
=over 4
=item * -b look for filename in current directory or in PATH
=item * -c cpanfile output
=item * -e exclude core modules
=item * -j JSON output
=item * -l succinct list, one module per line
=item * -0 succinct list, modules null separated (for xargs -0)
=cut
run(@ARGV) unless caller;
sub run {
my @args = @_;
my %opts;
{
local @ARGV = @args;
getopts('bcejl0', \%opts);
@args = @ARGV;
}
# if no parameters are passed, give usage information
unless( @args ) {
require Pod::Usage;
Pod::Usage::pod2usage( msg => 'Please supply at least one filename to analyze' );
exit;
}
use Data::Dumper;
my( $object, $method, $sub );
my @classes = qw( Module::Extract::Use Module::ExtractUse );
my %methods = (
'Module::Extract::Use' => [ 'get_modules_with_details', sub {
[ $_[0]->module, $_[0]->version ];
} ],
'Module::ExtractUse' => [ 'extract_use', sub {
say Dumper( \@_ );
[ $_[0], undef ];
} ],
);
foreach my $module ( @classes ) {
eval "require $module";
next if $@;
( $object, $method, $sub ) = ( $module->new, @{ $methods{$module} } );
}
die join(
"\n\t",
"Install one of these modules to make this program work:",
sort keys %methods
) . "\n"
unless defined $object;
if( $opts{'b'} ) {
require Config;
my @dirs = split /\Q$Config::Config{'path_sep'}/, $ENV{'PATH'};
my @found_args;
FILE: foreach my $file ( @args ) {
if( -e $file ) {
push @found_args, $file;
next FILE;
}
foreach my $dir ( @dirs ) {
print STDERR "Looking in $dir\n";
my $path = catfile $dir, $file;
if( -e $path ) {
push @found_args, $path;
next FILE;
}
}
}
@args = @found_args;
}
( run in 1.250 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )