How can I find out where a Perl module is installed?

PerlPathModuleConfig

Perl Problem Overview


How do get the path of a installed Perl module by name, e.g. Time::HiRes?

I want this just because I have to run my perl script on different nodes of a SGE Grid Engine system. Sometimes, even run as other username.

I can use CPAN.pm to install packages for myself, but it is not so easy to install for other users without chmod 666 on folders.

Perl Solutions


Solution 1 - Perl

perl -MTime::HiRes -e 'print $INC{"Time/HiRes.pm"}' or perldoc -l Time::HiRes

Solution 2 - Perl

Mostly I use perldoc to get a location:

$ perldoc -l Module

You can also get module details with the cpan tool that comes with Perl:

$ cpan -D Time::HiRes
Time::HiRes
-------------------------------------------------------------------------
    High resolution time, sleep, and alarm
    J/JH/JHI/Time-HiRes-1.9719.tar.gz
    /usr/local/perls/perl-5.10.0/lib/5.10.0/darwin-2level/Time/HiRes.pm
    Installed: 1.9711
    CPAN:      1.9719  Not up to date
    Andrew Main (Zefram) (ZEFRAM)
    zefram@fysh.org

It even works on modules that you haven't installed:

$ cpan -D Win32::Process
Win32::Process
-------------------------------------------------------------------------
    Interface to Win32 Process functions
    J/JD/JDB/Win32-Process-0.14.tar.gz
    Installed: 
    CPAN:      0.14  Not up to date
    Jan Dubois (JDB)
    [email protected]

I think maybe I need an XML option like svn.

Solution 3 - Perl

Note: This solution proposes use of a (self-authored) utility that you must download. While it offers what I believe to be helpful features, installing a third-party solution first is not an option for everyone.


I've created whichpm, a cross-platform CLI (Linux, macOS, Window) that locates installed Perl modules by module (package) name, and optionally reports information about them, including detection of accidental duplicates.

Examples

# Locate the Data::Dumper module.
$ whichpm Data::Dumper
/usr/lib/perl/5.18/Data/Dumper.pm

# Locate the Data::Dumper module, and also print
# version information and core-module status.
$ whichpm -v Data::Dumper
Data::Dumper    2.145   core>=5.005 /usr/lib/perl/5.18/Data/Dumper.pm

# Locate the Data::Dumper module and open it in your system's default text
# editor.
$ whichpm -e Data::Dumper

# Look for accidental duplicates of the Foo::Bar module.
# Normally, only 1 path should be returned.
$ whichpm -a Foo::Bar
/usr/lib/perl/5.18/Foo/Bar.pm
./Foo/Bar.pm

# Print the paths of all installed modules.
$ whichpm -a

Installation

Prerequisites: Linux, macOS, or Windows, with Perl v5.4.50 or higher installed.

Installation from the npm registry

With Node.js or io.js installed, install the package as follows:

[sudo] npm install whichpm -g
Manual installation (macOS and Linux)
  • Download the CLI as whichpm.
  • Make it executable with chmod +x whichpm.
  • Move it or symlink it to a folder in your $PATH, such as /usr/local/bin (OSX) or /usr/bin (Linux).

Solution 4 - Perl

If need to find which modules are actually used by your script you can use perl debuggers M command:

[ivan@server ~]$ perl -d your_script.pl
...

Debugged program terminated. Use q to quit or R to restart, use o inhibit_exit to avoid stopping after program termination, h q, h R or h o to get additional info.

DB<1> M 'AutoLoader.pm' => '5.60 from /usr/lib/perl5/5.8.8/AutoLoader.pm' 'Carp.pm' => '1.04 from /usr/lib/perl5/5.8.8/Carp.pm' ...

This will help in case when you have modules with same names but in different folder.

Solution 5 - Perl

I just find another one: http://www.perlmonks.org/?node_id=568730

#!/bin/sh

echo 'print map { sprintf( "%20s : %s\n", $_, $INC{$_} ) } sort keys %INC; print "\n'$1' version : $'$1'::VERSION\n\n"' | perl "-M$1" 

the script just print out everything in %INC when you run perl -MSTH::STH

eg:

$ whichpm CGI       
              CGI.pm : /System/Library/Perl/5.8.6/CGI.pm
         CGI/Util.pm : /System/Library/Perl/5.8.6/CGI/Util.pm
             Carp.pm : /System/Library/Perl/5.8.6/Carp.pm
         Exporter.pm : /System/Library/Perl/5.8.6/Exporter.pm
         constant.pm : /System/Library/Perl/5.8.6/constant.pm
         overload.pm : /System/Library/Perl/5.8.6/overload.pm
           strict.pm : /System/Library/Perl/5.8.6/strict.pm
             vars.pm : /System/Library/Perl/5.8.6/vars.pm
         warnings.pm : /System/Library/Perl/5.8.6/warnings.pm warnings/register.pm : /System/Library/Perl/5.8.6/warnings/register.pm

CGI version : 3.05

Solution 6 - Perl

I like to use the V module.

Just install it from CPAN or by installing the package libv-perl on Debian or Ubuntu.

Then use it like this:

$ perl -MV=DBI
DBI
    /Users/michiel/.plenv/versions/5.24.0/lib/perl5/site_perl/5.24.0/darwin-2level/DBI.pm: 1.636

Other output example:

$ perl -MV=Time::HiRes
Time::HiRes
    /usr/lib/perl/5.18/Time/HiRes.pm: 1.9725

Solution 7 - Perl

It seems like the simplest way is perldoc -l Time::HiRes.


If that isn't available for some reason, here's a pragmatic solution:

Step 1: Instantiate the module in your script...

#! /usr/bin/perl -w
use Time::HiRes();
new Time::HiRes();

Step 2: Execute the script with the Perl graphical debugger...

export PERL5LIB=$PERL5LIB:~/perl ## tell perl where to look for "Devel"/"ptkdb.pm"
perl -d:ptkdb (yourscript.pl)

Step 3: Step in to the new call.

The full pathname of the module will be displayed on the title-bar of the debugger window.


Another approach that might be useful would be to search all of the folders in $PERL5LIB.

Solution 8 - Perl

Perldoc -l works for me

perldoc -l "File::Find"
/opt/perl_32/lib/5.8.8/File/Find.pm

Solution 9 - Perl

To expand on @Ivan's answer that allows this to be run without installing additional software the following will use Perl's debugger to find a specific module (or modules):

perl -de 'use <Module Name>;'

For Example:

perl -de 'use DBD::Oracle;'

Output:

Loading DB routines from perl5db.pl version 1.37
Editor support available.

Enter h or 'h h' for help, or 'man perldebug' for more help.

DBD::Oracle::CODE(0x27f81d8)(/usr/local/lib64/perl5/DBD/Oracle.pm:113):
113:            $ENV{PERL_BADFREE} = 0;
  DB<1> q

Solution 10 - Perl

In OSX you can use:

> perl -e 'print join("\n",@INC)'

The result should be the location of your lib.

Then add this code in your Perl code:

use lib '/your/folder/location/to/lib';

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionGalaxyView Question on Stackoverflow
Solution 1 - PerljrockwayView Answer on Stackoverflow
Solution 2 - Perlbrian d foyView Answer on Stackoverflow
Solution 3 - Perlmklement0View Answer on Stackoverflow
Solution 4 - PerlIvan NevostruevView Answer on Stackoverflow
Solution 5 - PerlGalaxyView Answer on Stackoverflow
Solution 6 - PerlMichielBView Answer on Stackoverflow
Solution 7 - PerlBrent BradburnView Answer on Stackoverflow
Solution 8 - PerlThiaguView Answer on Stackoverflow
Solution 9 - PerlPaulJView Answer on Stackoverflow
Solution 10 - PerlShrmView Answer on Stackoverflow