Spec-Zone.ru › Perl 5.34

AutoLoader

СОДЕРЖАНИЕ

  • ИМЯ
  • СИНТАКСИС
  • ОПИСАНИЕ
    • Заглушки подпрограмм
    • Использование подпрограммы AUTOLOAD модуля AutoLoader
    • Переопределение подпрограммы AUTOLOAD модуля AutoLoader
    • Лексические единицы пакета
    • Не использование AutoLoader
    • AutoLoader против SelfLoader
    • Принудительное загрузка функции 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;). См. "SYNOPSIS" в 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.

Pragma vars (см. "vars" в perlmod) может использоваться в таких ситуациях как альтернатива явной квалификации всех глобальных переменных с именем пространства имён пакета. Переменные, предварительно объявленные с этим pragma, будут видны любым автоматически загруженным процедурам (но, к сожалению, не будут невидимыми вне пакета).

Не использование 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, но фактически не выполняется автоматически загруженная функция.

ЗАМЕЧАНИЯ

AutoLoader версии до Perl 5.002 имел немного другой интерфейс. Любые старые модули, использующие AutoLoader, должны быть изменены на новый стиль вызова. Обычно это просто означает изменение require на use, добавление явного импорта 'AUTOLOAD' при необходимости и удаление AutoLoader из @ISA.

В системах с ограничениями на длину имён файлов файл, соответствующий подпрограмме, может иметь более короткое имя, чем сама подпрограмма. Это может привести к конфликтам имён файлов. Пакет AutoSplit предупреждает о возможных конфликтах при использовании для разделения модуля.

AutoLoader может не найти файлы авторазбиения (или даже найти неправильные) в тех случаях, когда @INC содержит относительные пути, и программа chdir.

СМОТРИТЕ ТАКЖЕ

SelfLoader - автозагрузчик, который не использует внешние файлы.

АВТОР

AutoLoader поддерживается perl5-porters. Пожалуйста, направляйте все вопросы на соответствующий список рассылки. Все, что относится к выпуску CPAN, можно отправлять его разработчику.

Автор и разработчик: The 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.34.0/AutoLoader

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API