Когда ссылка подпрограммы в @INC называется?

Как гласит название, я не понимаю, когда будет вызвана такая подпрограмма. На странице require в perldoc можно написать:

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

но где это происходит точно? Требуемый пакет или требуемый script (или пакет)? Я пробовал оба с некоторыми инструкциями print, но не работал так четко, что я чего-то не получаю.

Ответ 1

Perl вызывает ссылку подпрограммы в @INC, когда она перемещается @INC для поиска модуля. То есть вы будете запускать его при попытке загрузить модуль с помощью use или require, и Perl не найдет этот модуль в предыдущих местах @INC.

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;

Вам нужно убедиться, что ссылка на подпрограмму находится в @INC, прежде чем пытаться загрузить модули. Помните, что use - это функция времени компиляции и что require - это функция времени выполнения. Как и при добавлении других "обычных" @INC записей, вы, вероятно, захотите сделать это в блоке BEGIN как можно раньше в своей программе.

Ответ 2

Чтобы избежать путаницы нашей подпрограммы с подпрограммами в стандартных модулях Perl, полезно использовать unshift вместо push. Поэтому он сначала будет использовать вашу подпрограмму из @INC.