views:

2137

answers:

9

How do you find the version of an installed Perl module?

This is in an answer down at the bottom, but I figure it important enough to live up here. With these suggestions, I create a function in my .bashrc

function perlmodver {
    perl -M$1 -e 'print "Version " . $ARGV[0]->VERSION . " of " . $ARGV[0] . \
    " is installed.\n"' $1
}
+16  A: 

Most modules (especially ones from The CPAN) have a $VERSION variable:

perl -MSome::Module -le 'print $Some::Module::VERSION'
zigdon
+3  A: 

If you are lucky, the module will have a package variable named $VERSION:

$ perl -MCPAN -e 'print "$CPAN::VERSION\n"'
1.9205

This is needed for modules to be distributed on CPAN, but internally developed modules might follow a different convention or none at all.

Jon Ericson
+2  A: 

I wrote a small script to report that: perlver.

This is a simple little tool that tells you what version of a module you have installed, and where the .pm file is located. It also ensures the module can be loaded successfully. It automatically converts ‘-’, ‘/’, or ‘\’ to ‘::’, so you can use a pathname or distribution name instead of the canonical module name.

It assumes that the module defines a $VERSION. If the module doesn't define a $VERSION, it will still tell you where the .pm file is, so you can examine it manually. You can also check several modules at once:

$ perlver CPAN DBD-Pg Getopt::Long
CPAN 1.7602 is
 /usr/lib/perl5/5.8.8/CPAN.pm
DBD::Pg 1.49 is
 /usr/lib/perl5/vendor_perl/5.8.8/i686-linux/DBD/Pg.pm
Getopt::Long 2.36 is
 /usr/lib/perl5/vendor_perl/5.8.8/Getopt/Long.pm
cjm
+1  A: 

In addition, for modules that use Exporter.pm, you can get this information with this trick:

perl -MSome::Module=99999 -ex
Some::Module version 99999 required--this is only version 1.9205 at ...

For modules that don't use Exporter.pm, a slightly longer trick reports the same information:

perl -e'use Some::Module 99999'
Some::Module version 99999 required--this is only version 1.9205 at ...
tye
+6  A: 

There is a less-typing trick, that works provided your module doesn't have something insane like a Unix timestamp as a version number.

perl -MFoo::Bar\ 9999

This works because what it translates to is

use Foo::Bar 9999;

i.e. a version of Foo::Bar that's at least version 9999 or newer. And what you get is

Foo::Bar version 9999 required--this is only version 1.1.
BEGIN failed--compilation aborted.

(Neat trick I learned from Matt Trout.)

Penfold
I've been using this for ages, too. Couldn't remember where I picked it up from, but most likely I got it from the same place.
rjray
Minor change for a Windows command prompt (for whatever reason): perl -M"Foo::bar 9999"
igelkott
+17  A: 

Why are you trying to get the version of the module? Do you need this from within a program, do you just need the number to pass to another operation, or are you just trying to find out what you have?

I have this built into the cpan (which comes with perl) with the -D switch so you can see the version that you have installed and the current version on CPAN:

$ cpan -D Text::CSV_XS

Text::CSV_XS
-------------------------------------------------------------------------
        Fast 8bit clean version of Text::CSV
        H/HM/HMBRAND/Text-CSV_XS-0.54.tgz
        /usr/local/lib/perl5/site_perl/5.8.8/darwin-2level/Text/CSV_XS.pm
        Installed: 0.32
        CPAN:      0.54  Not up to date
        H.Merijn Brand (HMBRAND)
        [email protected]

If you want to see all of the out-of-date modules, use the -O (capital O) switch:

$ cpan -O
Module Name                                Local    CPAN
-------------------------------------------------------------------------
Apache::DB                                0.1300  0.1400
Apache::SOAP                              0.0000  0.7100
Apache::Session                           1.8300  1.8700
Apache::SizeLimit                         0.0300  0.9100
Apache::XMLRPC::Lite                      0.0000  0.7100
... and so on

If you want to see this for all modules you have installed, try the -a switch to create an autobundle.

brian d foy
+3  A: 

VERSION is a UNIVERSAL method of all Perl classes. You can use it to get the module version (if it has been set which it usually has).

Here is a one liner where you only have to add the module name once:

perl -le 'eval "require $ARGV[0]" and print $ARGV[0]->VERSION' Some::Module
jmcnamara
+1  A: 

Check out the pmtools scripts on CPAN. If you're using a Debian(-based) distro, there's also a handy pmtools package. This includes a script "pmvers" that tells you a module's version. It's quite handy.

It does something similar to the various one-liners folks posted, but it's a bit smarter about error handling, and can give you the version of more than one module at once.

Dave Rolsky
+2  A: 

Thanks for the answers! I've created a function in my .bashrc to easily find the version of a Perl module:

function perlmodver {
    perl -M$1 -e 'print $ARGV[0]->VERSION . "\n"' $1
}
Drew Stephens