Что-то еще, что вам нужно знать. Это либо дополняет, либо заменяет необходимость переопределения require
.
Знаете ли вы, что вы можете добавлять хуки в качестве ссылок на ваш путь @INC
? Затем они будут применены глобально к операторам use
и require
.
Для цитирования perldoc требуется
Вы также можете вставить хуки в средство импорта, поместив код Perl непосредственно в массив @INC.
Существует три вида хуков: ссылки на подпрограммы, ссылки на массивы и благословенные объекты.
Ссылки на подпрограммы - самый простой случай. Когда система включения проходит через @INC и встречает подпрограмму, эта подпрограмма вызывается с двумя параметрами: первый ссылается на себя, а второй - на имя файла, который нужно включить (например, «Foo / Bar.pm») , Подпрограмма должна возвращать либо ничего, либо список из трех значений в следующем порядке:
1. Файловый дескриптор, из которого будет считан файл.
2. Ссылка на подпрограмму. Если нет файлового дескриптора (предыдущий элемент), то эта подпрограмма должна генерировать одну строку исходного кода за вызов, записывая строку в $ _ и возвращая 1, а затем, наконец, в конце файла, возвращая 0. Если есть файловый дескриптор, тогда подпрограмма будет вызываться, чтобы действовать как простой фильтр источника со строкой, читаемой в $ _. Снова верните 1 для каждой допустимой строки и 0 после того, как все строки были возвращены.
3. Дополнительное состояние для подпрограммы. Состояние передается как $ _ [1]. Ссылка на саму подпрограмму передается как $ _ [0]
Вот пример:
#!/usr/bin/perl
sub my_inc_hook {
my ($sub_ref, $file) = @_;
unless ($file =~ m{^HTTP/}) {
warn "passing through: $file\n";
return;
}
warn "grokking: $file\n";
return (\*DATA);
}
BEGIN {
unshift(@INC, \&my_inc_hook);
}
use strict;
require warnings;
require HTTP::Bazinga;
HTTP::Bazinga::it_works();
__DATA__
package HTTP::Bazinga;
sub it_works {warn "bazinga!\n"};
1;
Производит:
$ perl inc.pl
passing through: strict.pm
passing through: warnings.pm
grokking: HTTP/Bazinga.pm
bazinga!
Я считаю, что это работает для Perl 5.10.0 и выше.