Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When is a subroutine reference in @INC called?

Tags:

perl

As the title says, I'm not clear on when such a subroutine will be called. From the require page at perldoc one can write:

push @INC, \&my_sub;
sub my_sub {
   my ($coderef, $filename) = @_; # $coderef is \&my_sub
   ...
}

but where does this go exactly? The required package or the requiring script (or package)? I've tried both with some sentinel print statements but neither worked so clearly there is something I'm not getting.

like image 400
gvkv Avatar asked Mar 29 '10 20:03

gvkv


1 Answers

Perl calls a subroutine reference in @INC when it is traversing @INC to look for a module. That is, you'll trigger it when you try to load a module with use or require and Perl does not find that module in the preceding @INC locations.

BEGIN {
    push @INC, 
      sub { print "Oops: There was an error looking for $_[1]\n"; () };
    }

eval "use Cat::Burglar";
eval "use Local::NotThere";
require Cat::Burglar;

You need to ensure that your subroutine reference is in @INC before you try to load the modules. Remember that use is a compile time feature and that require is a run time feature. As with adding other "regular" @INC entries, you probably want to do it in a BEGIN block as early as possible in your program.

like image 78
brian d foy Avatar answered Oct 02 '22 20:10

brian d foy