AutoLoader
СОДЕРЖАНИЕ
ИМЯ
AutoLoader — загружать подпрограммы только по требованию
СИНОПСИС
package Foo;
use AutoLoader 'AUTOLOAD'; # import the default AUTOLOAD subroutine
package Bar;
use AutoLoader; # don't import AUTOLOAD, define our own
sub AUTOLOAD {
...
$AutoLoader::AUTOLOAD = "...";
goto &AutoLoader::AUTOLOAD;
} ОПИСАНИЕ
Модуль AutoLoader работает с модулем AutoSplit и маркером __END__ для отсрочки загрузки некоторых подпрограмм до их использования вместо их одновременной загрузки.
Для использования AutoLoader автору модуля необходимо поместить определения подпрограмм, подлежащих автоматической загрузке, после маркера __END__. (См. perldata.) Модуль AutoSplit затем может быть запущен вручную для извлечения определений в отдельные файлы auto/funcname.al.
AutoLoader реализует подпрограмму AUTOLOAD. При вызове неопределенной подпрограммы в клиентском модуле AutoLoader подпрограмма AUTOLOAD AutoLoader пытается найти подпрограмму в файле, имя которого связано с расположением файла, из которого был прочитан клиентский модуль. Например, если POSIX.pm находится в /usr/local/lib/perl5/POSIX.pm, AutoLoader будет искать подпрограмму perl POSIX в /usr/local/lib/perl5/auto/POSIX/*.al, где файл .al имеет то же имя, что и подпрограмма, без указания пакета. Если такой файл существует, AUTOLOAD прочитает и оценит его, тем самым (предположительно) определив необходимую подпрограмму. Затем AUTOLOAD goto вновь определенную подпрограмму.
После завершения этого процесса для данной функции она определена, поэтому последующие вызовы подпрограммы будут обходить механизм AUTOLOAD.
Плечи подпрограмм
Для правильной работы поиска методов объектов и/или проверки прототипов, даже когда методы еще не определены, необходимо «предварительно объявить» каждую подпрограмму (как в sub NAME;). См. "СИНОПСИС" в perlsub. Такое предварительное объявление создает «плечи подпрограмм», которые являются заглушками без кода.
Модули AutoSplit и AutoLoader автоматизируют создание предварительных объявлений. Модуль AutoSplit создает файл «индекса», содержащий предварительные объявления всех подпрограмм AutoSplit. При использовании модуля AutoLoader он загружает эти объявления в пакет вызывающих его модулей.
Из-за этого механизма важно, чтобы AutoLoader всегда use и не require.
Использование подпрограммы AUTOLOAD модуля AutoLoader
Для использования подпрограммы AUTOLOAD AutoLoader необходимо явно импортировать ее:
use AutoLoader 'AUTOLOAD'; Переопределение подпрограммы AUTOLOAD модуля AutoLoader
Некоторые модули, в основном расширения, предоставляют свои собственные подпрограммы AUTOLOAD. Как правило, им необходимо проверить некоторые специальные случаи (например, константы), а затем перейти к подпрограмме AUTOLOAD AutoLoader для остальной части.
Такие модули не должны импортировать подпрограмму AUTOLOAD AutoLoader. Вместо этого они должны определить свои собственные подпрограммы AUTOLOAD примерно так:
use AutoLoader;
use Carp;
sub AUTOLOAD {
my $sub = $AUTOLOAD;
(my $constname = $sub) =~ s/.*:://;
my $val = constant($constname, @_ ? $_[0] : 0);
if ($! != 0) {
if ($! =~ /Invalid/ || $!{EINVAL}) {
$AutoLoader::AUTOLOAD = $sub;
goto &AutoLoader::AUTOLOAD;
}
else {
croak "Your vendor has not defined constant $constname";
}
}
*$sub = sub { $val }; # same as: eval "sub $sub { $val }";
goto &$sub;
} Если собственная подпрограмма AUTOLOAD любого модуля не нуждается в переходе к подпрограмме AUTOLOAD AutoLoader (потому что у него нет подпрограмм AutoSplit), то этот модуль вообще не должен использовать AutoLoader.
Лексические единицы пакета
Лексические единицы пакета, объявленные с помощью my в основном блоке пакета, использующего AutoLoader, не будут видны подпрограммам, загруженным автоматически, из-за того, что указанный область видимости заканчивается на марке __END__. Модуль, использующий такие переменные как глобальные переменные пакета, не будет работать должным образом с AutoLoader.
Предикат vars (см. "vars" в perlmod) может использоваться в таких ситуациях в качестве альтернативы явному квалификации всех глобальных переменных с помощью пространства имен пакета. Переменные, предварительно объявленные с помощью этого предикатов, будут видны любым автоматически загруженным процедурам (но, к сожалению, они не будут скрыты за пределами пакета).
Отключение использования AutoLoader
Вы можете прекратить использование AutoLoader, просто
no AutoLoader; AutoLoader против SelfLoader
AutoLoader похож по назначению на SelfLoader: оба откладывают загрузку подпрограмм.
SelfLoader использует маркер __DATA__ вместо __END__. Хотя это позволяет избежать использования иерархии файлов на диске и связанных с ними операций открытия/закрытия для каждой загружаемой подпрограммы, SelfLoader страдает от недостатков скорости запуска при однократном анализе строк после __DATA__, после чего подпрограммы кэшируются. SelfLoader также может обрабатывать несколько пакетов в одном файле.
AutoLoader считывает код только по мере необходимости и во многих случаях должен быть быстрее, но требует механизма, подобного AutoSplit, для создания отдельных файлов. ExtUtils::MakeMaker автоматически вызовет AutoSplit, если AutoLoader используется в исходном файле модуля.
Принудительная загрузка функции AutoLoader
Иногда может быть необходимо или полезно убедиться, что определенная функция полностью загружена AutoLoader. Например, это необходимо, когда вам нужно обернуть функцию, чтобы вставить код отладки. Это также полезно для принудительной ранней загрузки кода перед разветвлением, чтобы максимально использовать копирование при записи.
Начиная с AutoLoader 5.73, вы можете вызвать функцию AutoLoader::autoload_sub с полным квалифицированным именем функции, которую нужно загрузить из файла .al. Поведение точно такое же, как если бы вы вызвали функцию, запустив обычный механизм AUTOLOAD, но фактически не выполняется автоматически загруженная функция.
ЗАМЕЧАНИЯ
У AutoLoaders, предшествовавших Perl 5.002, был немного другой интерфейс. Все старые модули, использующие AutoLoader, должны быть изменены на новый стиль вызова. Как правило, это просто означает изменение require на use, добавление явного импорта 'AUTOLOAD' при необходимости и удаление AutoLoader из @ISA.
В системах с ограничениями на длину имени файла файл, соответствующий подпрограмме, может иметь более короткое имя, чем сама подпрограмма. Это может привести к конфликтам имен файлов. Пакет AutoSplit предупреждает об этих потенциальных конфликтах при разделении модуля.
AutoLoader может не найти файлы autosplit (или даже найти неправильные) в тех случаях, когда @INC содержит относительные пути, и программа chdir.
СМОТРИТЕ ТАКЖЕ
SelfLoader — автозагрузчик, который не использует внешние файлы.
АВТОР
AutoLoader поддерживается командой perl5-porters. Пожалуйста, направляйте любые вопросы на соответствующий список рассылки. Любые вопросы, касающиеся выпуска CPAN, можно направлять его ответственным.
Автор и ответственный: Команда Perl5-Porters <perl5-porters@perl.org>
Ответственный за выпуск CPAN: Steffen Mueller <smueller@cpan.org>
АВТОРСКИЕ ПРАВА И ЛИЦЕНЗИЯ
Этот пакет был частью ядра perl с момента первого выпуска perl5. Он был выпущен отдельно на CPAN, чтобы старые установки могли воспользоваться исправлениями ошибок.
Этот пакет имеет те же авторские права и лицензию, что и ядро perl:
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
2011, 2012, 2013
by Larry Wall and others
All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of either:
a) the GNU General Public License as published by the Free
Software Foundation; either version 1, or (at your option) any
later version, or
b) the "Artistic License" which comes with this Kit.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See either
the GNU General Public License or the Artistic License for more details.
You should have received a copy of the Artistic License with this
Kit, in the file named "Artistic". If not, I'll be glad to provide one.
You should also have received a copy of the GNU General Public License
along with this program in the file named "Copying". If not, write to the
Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
MA 02110-1301, USA or visit their web page on the internet at
http://www.gnu.org/copyleft/gpl.html.
For those of you that choose to use the GNU General Public License,
my interpretation of the GNU General Public License is that no Perl
script falls under the terms of the GPL unless you explicitly put
said script under the terms of the GPL yourself. Furthermore, any
object code linked with perl does not automatically fall under the
terms of the GPL, provided such object code only adds definitions
of subroutines and variables, and does not otherwise impair the
resulting interpreter from executing any standard Perl script. I
consider linking in C subroutines in this manner to be the moral
equivalent of defining subroutines in the Perl language itself. You
may sell such an object file as proprietary provided that you provide
or offer to provide the Perl source, as specified by the GNU General
Public License. (This is merely an alternate way of specifying input
to the program.) You may also sell a binary produced by the dumping of
a running Perl script that belongs to you, provided that you provide or
offer to provide the Perl source as specified by the GPL. (The
fact that a Perl interpreter and your code are in the same binary file
is, in this case, a form of mere aggregation.) This is my interpretation
of the GPL. If you still have concerns or difficulties understanding
my intent, feel free to contact me. Of course, the Artistic License
spells all this out for your protection, so you may prefer to use that.
© 1993–2021 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.36.0/AutoLoader