<?xml version="1.0" encoding="windows-1252"?>
<node id="203148" title="robustly list any Perl code's module dependencies" created="2002-10-06 07:39:36" updated="2005-08-15 16:50:44">
<type id="1748">
sourcecode</type>
<author id="114691">
Aristotle</author>
<data>
<field name="doctext">
&lt;code&gt;#!/usr/bin/perl -w
package ListDependencies;
use strict;
unshift @INC, sub {
        local $_ = $_[1];
        return unless /[[:upper:]]/;
        s/\.pm$//i;
        s/[\/:]/::/g;
        print STDERR $_, $/;
};
1;
__END__

=head1 NAME

ListDependencies.pm - list any Perl code's module dependencies

=head1 SYNOPSIS

perl -c -MListDependencies scriptname
perl -MListDependencies -MModule::Name -e1
perl -MListDependencies -e'use Module::Name'

=head1 DESCRIPTION

This module prints the names of any modules any piece
of Perl code compiled after it tries to load to C&lt;STDERR&gt;,
but ignores C&lt;use pragma;&gt; directives. You should load
this module prior to all others. The C&lt;-M&gt; command line
switch to C&lt;perl&gt; is a good place to do so.

Note that it won't prevent execution of the code you're
trying to examine. If all you want to do is list
dependencies for a piece of standalone code, you may
want to use the C&lt;-c&gt; command line switch to C&lt;perl&gt; to
check compile time dependencies. Be aware that this will
leave you blind to any attempts to load modules
dynamically at runtime.

=head1 CAVEATS

If your own custom modules use all-lowercase names, this
module won't list them. This is intentional:
all-lowercase names are reserved for Perl pragmas.

Note that not all pragmas are available everywhere, so
they may constitute a depency as well. L&lt;warnings&gt; is an
obvious example.

=head1 BUGS

There is no way to specify a different output file handle
than C&lt;STDERR&gt;. A proper version should include an
C&lt;import()&gt; routine to take care of this.

=head1 RESTRICTIONS

The module only honours Unix, DOSish and MacOS directory
separators. A more portable solution would have to rely
on L&lt;File::Spec&gt;, but unfortunately that would require
this module to import modules itself.
Heisenberg's Dispersion Relation applies. :-)

=head1 AUTHOR

Aristotle Pagaltzis &lt;pagaltzis at gmx dot de&gt;

=head1 COPYRIGHT

Copyright 2002. This may be modified and distributed on
the same terms as Perl.&lt;/code&gt;</field>
<field name="codedescription">
&lt;p&gt;I just read [hans_moleman]'s [id://203128|script] and thought there has to be a more robust way to do this that doesn't rely on parsing sources and has better support for recursive dependencies than just reporting whether a toplevel dependency is satisfied. This module is the surprisingly simple result. It relies on the fact that you [http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2001-02/msg01780.html|can put coderefs in &lt;tt&gt;@INC&lt;/tt&gt;].&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; [podmaster] points out that not all pragmas are available everywhere, [warnings] being an obvious example, so they constitute a depency, too. I don't want to change the behaviour of this module however, therefor I added this to the CAVEATS section in the POD.&lt;/p&gt;</field>
<field name="codecategory">
Utility Scripts</field>
<field name="codeauthor">
/msg [Aristotle]</field>
</data>
</node>
