How does require find the module to be loaded?
Now you know how to create a module in Perl, but it is not yet clear how did perl find the Calc.pm file in the previous example? After all we only wrote require Calc;.
Before going further though two things:
You probably have already used modules in Perl and you have probably used the use keyword to load the modules. Don't worry, everything you see here about require also applies to use as internally use calls require.
You have probably also seen modules with one or more double-colon pairs between names. So not only Calc, but Math::Calc, and even Math::Calc::Clever are possible names.
When you write require Calc; perl will look through the directories listed in the array called @INC for a file called Calc.pm.
If you'd like to find out what is in @INC, you can run perl -V on the command line. At the end of the output you will see the list of directories. For example on OSX I got this:
@INC: /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.2 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 .
On MS Windows using Strawberry Perl I got this:
@INC: C:/strawberry/perl/lib C:/strawberry/perl/site/lib C:\strawberry\perl\vendor\lib .
Note, in both cases the . indicating the current directory can be found in the list at the last position. This means if the module is in the current directory, perl will find it. On the other hand, if the module is in the lib/ subdirectory then perl won't find it without some extra help.
If you require a module that has a double-colon in its name, for example Math::Calc then perl will look for a subdirectory called Math in the directories listed in @INC, and within that Math subdirectory it will look for a file called Calc.pm.
The first one it finds will be loaded into memory. So there might be several such files in the directories listed in @INC, but perl will find the first one and disregard the rest.
If you require Math::Calc::Clever; then perl will look for a subdirectory called Math in the directories listed in @INC. Inside the Math directory it will look for a directory called Calc and in that directory a file called Clever.pm.
If perl cannot find the right file in any of the directories it will throw an exception Can't locate ... in @INC.
Published on 2017-01-22