Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw

Re: Finding version of a Perl module

by merlyn (Sage)
on Sep 09, 2005 at 13:25 UTC ( #490564=note: print w/replies, xml ) Need Help??

in reply to Finding version of a Perl module

% perl -MCGI\ 9999999 CGI version 9999999 required--this is only version 3.11. BEGIN failed--compilation aborted. %
Dunno where I got that trick, but it's really easy.

-- Randal L. Schwartz, Perl hacker
Be sure to read my standard disclaimer if this is a reply.

Replies are listed 'Best First'.
Re^2: Finding version of a Perl module
by ikegami (Pope) on Sep 09, 2005 at 14:07 UTC

    Caveat: merlyn's trick only works is the module uses Exporter or immitates Exporter's version checks (Added for clarity:) by writting an import which calls UNIVERSAL::VERSION.

    Update: Apparently, perl will call UNIVERSAL::VERSION for you if the version is passed as a number, not a string.

      I don't think so. The version check is done by UNIVERSAL::VERSION , which is called by use when you specify a version number when using a module.

      From "perldoc -f use":

      If the VERSION argument is present between Module and LIST, then the "use" will call the VERSION method in class Module with the given version as an argument. The default VERSION method, inherited from the UNIVERSAL class, croaks if the given version is larger than the value of the variable $Module::VERSION.
        Yes, but you need something to call UNIVERSAL::VERSION. Usually, that something is Exporter. Proof:
        # # ========== package Module1; our $VERSION = '2.0'; 1;
        # # ========== package Module2; use Exporter (); our $VERSION = '2.0'; our @ISA = 'Exporter'; 1;
        # # ========= BEGIN { print("Loading Module1...\n"); } use Module1 '3.0'; BEGIN { print("Loaded.\n"); } BEGIN { print("Loading Module2...\n"); } use Module2 '3.0'; BEGIN { print("Loaded.\n"); }
        output ====== Loading Module1... Loaded. Loading Module2... Module2 3.0 required--this is only version 2.0 ( at script. +pl line 6 BEGIN failed--compilation aborted at line 6.

        Notice how the version passed to Module1 is completely ignored.

        In writing this test, I also found errors in what I thought I knew.

        1) *import = \&Exporter::import; doesn't work as well as I thought. My original Module2 gave a run-time error. It was:

        package Module2; use Exporter (); our $VERSION = '2.0'; *import = \&Exporter::import; 1;

        To fix without inheriting from Exporter, one needs to also import require_version:

        package Module2; use Exporter (); our $VERSION = '2.0'; *import = \&Exporter::import; *require_version = \&Exporter::require_version; 1;

        2) I always thought use Module 'maj.min' would make sure the major version is the same as the one in $VERSION, yet use Module2 '1.0' doesn't fail.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://490564]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (5)
As of 2021-06-16 13:38 GMT
Find Nodes?
    Voting Booth?
    What does the "s" stand for in "perls"? (Whence perls)

    Results (74 votes). Check out past polls.