Main Content

Where do Perl modules load from

Archive - Originally posted on "The Horse's Mouth" - 2005-06-24 20:48:11 - Graham Ellis

When you're writing a Perl program, you're strongly encouraged to use existing code that's already been written to perform common functions. Not only does this save you time re-coding, but it also means you get code that's already tested and proven, and there's only one piece of code to be maintained for each piece of functionallity thereafter rather than two.

Shared (re-used) code may come as part of the Perl distribution - modules like Carp and File::Compare. It may be more specialist code that you download from the CPAN - for example DBI and DBD. Or it may be code that's just shared within your organisation or even just your department or between your personal applications. And in all cases, you "pull" the code into your program with a use statement:

use Carp;
use File::Compare;
use toothbrush;


Where does your Perl program load these modules from? It uses the list @INC which is prepopulated with each of the directories where Perl should look in turn. If you want to add some directories from the command line too, you can use the -I option to perl (see man perlrun for details. But what if you want to add an extra directory or two in your program? You're allowed to change @INC right enough, but even if you do so ahead of your use statement you'll be too late because the use is interpretted at compile time.

Solution? Modify your @INC list in a BEGIN block, since BEGIN blocks are interpretted at compile time too. Here's an example:

BEGIN {
push @INC,"extrabitz";
}

use toothbrush;


The directory "extrabitz" (a subdirectory of the current directory when the program is run) is added onto the end of the list of places for Perl to look ... and in this case, that's probably where it will find "toothbrush".

And if you even wonder what your Perl program has loaded from where, the information is available to you in the %INC hash. Perhaps that should be another day's story!