SPUG: add a path to @INC

Andrew Sweger andrew at sweger.net
Sun Jan 16 18:53:42 PST 2005

On Sun, 16 Jan 2005, C.J.Collier wrote:

> Note that if you want to use C<@INC> to C<use()> modules, I believe you 
> need to put the C<use lib '...';> in a C<BEGIN { ... }> block, thus:


I think you're wrong. But I'll have to write a test now to double-check

File: ./ascript.pl

use warnings;
use strict;
use lib './mylib';
    print "About to load Ned...\n";
    use Ned;
    print "Done loading Ned.\n";

my $foo = new Ned;

File: ./mylib/Ned.pm
package Ned;
use warnings;
use strict;

sub new {
    my $foo = {};
    return bless $foo; # Hey! I wouldn't do this for real.

sub hello {
    my $thing = shift;
    print "Hello\n";

print "Done loading module Ned. Thank you. Come again.\n";
return 1;

% perl ./ascript.pl
Done loading module Ned. Thank you. Come again.
About to load Ned...
Done loading Ned.

Note that all of the 'use' clauses are parsed and loaded even the one
*inside* the BEGIN block. Thus, there's no point putting bare use clauses
inside BEGIN blocks. Usually one uses a require in a BEGIN block (in a
module) to conditionally load a module (as the lib pragma does to load
File::Spec on MacOS). As long as the lib pragma falls before the 'use'
"call" loading your module in a directory located via the lib pragma, it
should work.

> I could be wrong, though.  Whee.

See? It happens to the best people too. Not just me.

Andrew B. Sweger -- The great thing about multitasking is that several
                                things can go wrong at once.

More information about the spug-list mailing list