[Purdue-pm] Question about Versions

Mark Senn mark at ecn.purdue.edu
Wed Jul 9 12:00:16 PDT 2014


>  In Javascript, when I include a library I wrote, I put <script
>  src="bulldada_0.1.js"> and if I want to work on the module and make
>  changes, I can do that to bulldada_0.2.js, and I can change the HTML
>  when and if I'm ready to use 0.2. Theoretically, I can have a directory
>  full of bulldada_*.*.js.
>  
>  The capabilities are almost there with Perl. I can specify a version in my
>  module:
>      package Bull::Dada ;
>      our $VERSION = 0.01 ;
>      1
>  
>  I can specify a version number in my code;
>      use strict ;
>      use lib '/home/jacoby/lib' ;
>      use Bull::Dada 0.01 ;
>  
>  But, Bull::Dada, as I understand it, has to be
>  /home/jacoby/lib/Bull/Dada.pm. I couldn't have it be
>  /home/jacoby/lib/Bull/ Dada_0.01.pm alongside Dada_0.02.pm, where I'm
>  changing the subroutines around and such, but I'm not ready to use it in
>  real code, or perhaps it uses OAuth 2.0 while 0.01 uses OAuth 1.0 or
>  whatever.
>  
>  To my knowledge, I cannot do this in Perl, as much as I may desire it. Am I
>  wrong?

You can do it just like with the .js files.  Just name them differently,
say, Dada001.pm and Dada002.pm.  As far as I know there is nothing in the
Perl 5.20 core that will do what you want where a module name and version
number map to a unique file name.

Or, do something like this, here is the t.pl file:

    #!/usr/new/bin/perl
    #
    #  /usr/new/bin/perl --version
    #  prints
    #  This is perl 5, version 20, subversion 0 (v5.20.0)
    #  built for x86_64-linux-thread-multi
    #
    
    use Modern::Perl;
    
    # Use one of the following two lines.
    # I link this because it it's pretty staightforward and
    # isn't too much action at a distance.
    use lib qw(./Testing ./Production ./NeededForBoth);
    # use lib qw(./Production ./Testing ./NeededForBoth);
    
    use MyPackage;
    PrintWhich;

Here is Testing/MyPackage.pm:

    # ./Testing/MyPackage.pm

    package MyPackage;

    use feature 'say';

    use Exporter;

    our @ISA         = qw/Exporter/;
    our @EXPORT      = qw/&PrintWhich/;
    our @EXPORT_OK   = qw//;
    our %EXPORT_TAGS = ();
    our $VERSION     = 0.02;

    sub PrintWhich
    {
        say 'Testing';
    }

    1

And here is Production/MyPackage.pm

    # ./Production/MyPackage.pm

    package MyPackage;

    use feature 'say';

    use Exporter;

    our @ISA         = qw/Exporter/;
    our @EXPORT      = qw/&PrintWhich/;
    our @EXPORT_OK   = qw//;
    our %EXPORT_TAGS = ();
    our $VERSION     = 0.01;

    sub PrintWhich
    {
        say 'Production';
    }

    1

Or, you could invoke the packages with names in an index that
get take the module name and the version number and map that
into a filename.  I wouldn't do that though, just another thing
to worry about.  For me it is easier to think about Perl
modules if they exist in one directory will be used before
any that exist in other directories.

-mark


More information about the Purdue-pm mailing list