Когда вызывается ссылка на подпрограмму в @INC? - PullRequest
9 голосов
/ 30 марта 2010

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

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

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

Ответы [ 2 ]

12 голосов
/ 30 марта 2010

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

1 голос
/ 30 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...