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

Как видно из названия, мне не ясно, когда будет вызываться такая подпрограмма. Со страницы Require на Perldoc можно написать:

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

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

2 ответа

Решение

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 заблокировать как можно раньше в вашей программе.

Чтобы не путать нашу подпрограмму с подпрограммами в стандартных модулях Perl, как правило, полезно использовать unshift вместо push, Так что сначала он будет использовать вашу подпрограмму из @INC,

Другие вопросы по тегам