Когда вызывается ссылка на подпрограмму в @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
,