beermad has asked for the wisdom of the Perl Monks concerning the following question:

I'm sure the first response will be "why?", but bear with me, there's a good reason.

I'm looking for a way to do something with a similar effect to "use lib", but which appends rather than prepends directories to the @INC path.

Reason is, my desktop machine is 64-bit, but as a Web developer, most of what I write will end up on a 32-bit machine. So in what I deliver I have to include modules that won't be on the live server (such as GD). But of course, where these have compiled code rather than simple Perl source (such as GD), they'll fail on my development system.

So what I need my scripts to do is to search for modules such as these in the standard locations on my development machine but fall-back to the libraries I supply for the production system.

I appreciate this will be less-than-optimum in production, but it's a price worth paying for my sanity.

  • Comment on Appending rather than prepending in "use lib"

Replies are listed 'Best First'.
Re: Appending rather than prepending in "use lib"
by toolic (Bishop) on Oct 31, 2010 at 14:34 UTC
    Instead of lib, you can try to push onto @INC. Does this work for you?
    use strict; use warnings; BEGIN { push @INC, '/path/foo' }
      Works a treat. Many thanks.
Re: Appending rather than prepending in "use lib"
by locked_user sundialsvc4 (Abbot) on Nov 02, 2010 at 00:24 UTC

    As perldoc explicitly states, @INC is “just an ordinary array.”   The one and only thing “special” about it is... how Perl uses it.

    Having said that...   things like use lib are (quite sensibly...) designed to conveniently deal with “the rule, rather than the exception,” and... TMTOWTDI!

    If you want to add a value to the end of @INC ... “hey, this is Perl!   Just Do It.™”

    Features like use lib are (sensibly...) designed in the spirit of DWIM™.   If your stated purpose is merely “to use a library,” then you (of course...) shouldn’t be obliged to think of that “in terms of @INC” ... unless you want to.   (And yet, if you want to, you should be free to.)

Re: Appending rather than prepending in "use lib"
by beermad (Novice) on Nov 18, 2010 at 15:53 UTC

    A little update on this question, as I've found another solution since implementing the suggested one. Just in case it happens to help anybody coming along later who needs a similar thing.

    I discovered at http://perldoc.perl.org/lib.html, the interesting snippet:

    For each directory in LIST (called $dir here) the lib module also checks to see if a directory called $dir/$archname/auto exists. If so the $dir/$archname directory is assumed to be a corresponding architecture specific directory and is added to @INC in front of $dir. lib.pm also checks if directories called $dir/$version and $dir/$version/$archname exist and adds these directories to @INC.

    So... It's possible to have a number of subdirectories under an included directory, each with the relevant architecture name and the architecture-dependent files under them.

    The correct architecture name is found by issuing: perl -V:archname

    So for example, under my modules directory, I now have i386-linux-thread-multi and x86_64-linux-thread-multi containing the 32-bit and 64-bit modules respectively.