Spec-Zone.ru › Perl 5.34

SelfLoader

СОДЕРЖАНИЕ

  • ИМЯ
  • СИНОПСИС
  • ОПИСАНИЕ
    • Токен __DATA__
    • Автозагрузка SelfLoader
    • Автозагрузка и лексические переменные пакета
    • SelfLoader и AutoLoader
    • __DATA__, __END__ и файловый дескриптор FOOBAR::DATA
    • Классы и унаследованные методы.
  • Множественные пакеты и полностью квалифицированные имена подпрограмм
  • АВТОР
  • АВТОРСКИЕ ПРАВА И ЛИЦЕНЗИЯ

ИМЯ

SelfLoader - загружает функции только по требованию

СИНОПСИС

package FOOBAR;
use SelfLoader;

... (initializing code)

__DATA__
sub {....

ОПИСАНИЕ

Этот модуль сообщает своим пользователям, что функции в пакете FOOBAR должны быть загружены автоматически после токена __DATA__. См. также "Автозагрузка" в perlsub.

Токен __DATA__

Токен __DATA__ сообщает компилятору Perl, что код Perl для компиляции завершен. Все, что следует за токеном __DATA__, доступно для чтения через файловый дескриптор FOOBAR::DATA, где FOOBAR - имя текущего пакета в момент достижения токена __DATA__. Это работает точно так же, как __END__ в пакете 'main', но для других модулей данные после __END__ не доступны автоматически, в то время как данные после __DATA__ доступны. Токен __DATA__ не распознается в версиях Perl до 5.001m.

Обратите внимание, что в одном пакете может быть несколько токенов __DATA__, и что последний токен __DATA__ в данном пакете, который встречается компилятором, является тем, который доступен через файловый дескриптор. Это также относится к __END__ и main, то есть, если у программы 'main' есть __END__, а модуль 'require'd (_не_ 'use'd) этой программой имеет объявление 'package main;' и далее '__DATA__', то файловый дескриптор DATA настроен на доступ к данным после __DATA__ в модуле, _а не_ к данным после __END__ в программе 'main', так как компилятор встречает файл 'require' позже.

Автозагрузка SelfLoader

SelfLoader работает путем размещения токена __DATA__ _после_ кода Perl, который необходимо скомпилировать и выполнить во время 'require', но _перед_ объявлениями подпрограмм, которые могут быть загружены позже - обычно потому, что они могут никогда не вызываться.

SelfLoader будет читать из файлового дескриптора FOOBAR::DATA, чтобы загрузить данные после __DATA__, и загрузить любую подпрограмму при ее вызове. Стоимость - однократный разбор данных после __DATA__, и задержка загрузки при _первом_ вызове любой загружаемой автоматически функции. Преимущества (в идеале) - ускорение фазы компиляции без необходимости загрузки функций, которые никогда не используются.

SelfLoader прекратит чтение из __DATA__ при встрече токена __END__ - как вы и ожидаете. Если присутствует токен __END__ и за ним следует токен DATA, то SelfLoader оставляет файловый дескриптор FOOBAR::DATA открытым на строке после этого токена.

SelfLoader экспортирует подпрограмму AUTOLOAD в пакет, использующий SelfLoader, и это загружает вызываемую подпрограмму при первом вызове.

Нет никакого преимущества в размещении подпрограмм, которые _всегда_ будут вызываться после токена __DATA__.

Автозагрузка и лексические переменные пакета

Оператор 'my $pack_lexical' делает переменную $pack_lexical локальной _только_ для файла до токена __DATA__. Подпрограммы, объявленные где-либо еще, _не_ могут видеть эти типы переменных, точно так же, как если бы вы объявляли подпрограммы в пакете, но в другом файле, они не могут видеть эти переменные.

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

SelfLoader и AutoLoader

SelfLoader может заменить AutoLoader - просто измените 'use AutoLoader' на 'use SelfLoader' (хотя обратите внимание, что SelfLoader экспортирует функцию AUTOLOAD - но если у вас есть своя AUTOLOAD и вы также используете AutoLoader, вы, вероятно, знаете, что делаете), и токен __END__ на __DATA__. Вам понадобится perl версии 5.001m или более поздней для использования этого (версия 5.001 с исправлениями до исправления m).

Нет необходимости наследоваться от SelfLoader.

SelfLoader работает аналогично AutoLoader, но собирает подпрограммы после __DATA__ вместо директории 'lib/auto'. Существует выигрыш в обслуживании, так как нет необходимости запускать AutoSplit для модуля при установке, и выигрыш во времени выполнения, так как нет необходимости постоянно открывать и закрывать файлы для загрузки подпрограмм. Есть потеря во времени выполнения, связанная с необходимостью разбора кода после __DATA__. Подробности о AutoLoader и другая точка зрения на эти различия можно найти в документации этого модуля.

__DATA__, __END__ и файловый дескриптор FOOBAR::DATA

Этот раздел актуален только если вы хотите использовать FOOBAR::DATA вместе с SelfLoader.

Данные после токена __DATA__ в модуле считываются с помощью файлового дескриптора FOOBAR::DATA. __END__ по-прежнему может использоваться для обозначения конца раздела __DATA__, если за ним следует токен DATA - это поддерживается SelfLoader. Файловый дескриптор FOOBAR::DATA остается открытым, если обнаруживается __END__ за которым следует DATA, с файловым дескриптором, помещенным в начало строки после __END__ токена. Если токен __END__ отсутствует, или токен __END__ без токена DATA в той же строке, то файловый дескриптор закрывается.

SelfLoader считывает с текущего положения файлового дескриптора FOOBAR::DATA до конца файла или __END__. Это означает, что если вы хотите использовать этот файловый дескриптор (и ТОЛЬКО если вы хотите), вы должны либо

1. Разместить все объявления подпрограмм непосредственно после токена __DATA__ и разместить свои собственные данные после этих объявлений, используя токен __END__ для обозначения конца объявлений подпрограмм. Также необходимо убедиться, что SelfLoader читает сначала, вызвав 'SelfLoader->load_stubs();', или используя функцию, которая самозагружается;

или

2. Вы должны сначала прочитать файловый дескриптор FOOBAR::DATA, оставив дескриптор открытым и помещённым на первую строку объявлений подпрограмм.

Вы теоретически можете сделать оба способа.

Классы и унаследованные методы.

Для модулей, которые не являются классами, этот раздел не актуален. Этот раздел актуален только если у вас есть методы, которые могли бы быть унаследованы.

Черновик подпрограммы (или объявление вперед) выглядит следующим образом

sub stub;

т.е. это объявление подпрограммы без тела подпрограммы. Для модулей, которые не являются классами, черновики не так важны с точки зрения автозагрузки.

Для модулей, КОТОРЫЕ ЯВЛЯЮТСЯ классами и нуждаются в обработке унаследованных методов, черновики необходимы для обеспечения правильной работы механизма наследования методов. Вы можете загрузить черновики в модуль во время 'require', добавив оператор 'SelfLoader->load_stubs();' в модуль для этого.

Альтернативой является размещение черновиков перед токеном __DATA__ ДО выпуска модуля, и для этой цели доступен модуль Devel::SelfStubber. Однако это требует дополнительного шага, гарантирующего наличие черновиков в модуле. Если это делается, я настоятельно рекомендую делать это ДО выпуска модуля - это НЕ должно выполняться во время установки в общем случае.

Множественные пакеты и полностью квалифицированные имена подпрограмм

Подпрограммы в нескольких пакетах в одном файле поддерживаются - но вы должны учесть, что это требует экспорта SelfLoader::AUTOLOAD в каждый пакет, который его требует. Это выполняется автоматически SelfLoader при первой загрузке подпрограмм в кэш, но вы действительно должны указать это в инициализации перед __DATA__ с помощью оператора 'use SelfLoader' в каждом пакете.

Поддерживаются и полностью квалифицированные имена подпрограмм. Например,

__DATA__
sub foo::bar {23}
package baz;
sub dob {32}

все они будут загружены правильно SelfLoader, и SelfLoader гарантирует, что пакеты 'foo' и 'baz' правильно имеют метод AUTOLOAD SelfLoader, когда данные после __DATA__ будут прочитаны в первый раз.

АВТОР

SelfLoader поддерживается 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 by Larry Wall and others

Все права защищены.

Эта программа является свободной программой; вы можете перераспределять ее и/или изменять ее в соответствии с условиями:

a)

Лицензия GNU General Public, опубликованная Фондом свободного программного обеспечения; либо версия 1, либо (по вашему выбору) любая более поздняя версия, либо

b)

«Художественная лицензия», которая поставляется с этим набором.

Эта программа распространяется в надежде, что она будет полезна, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; без даже подразумеваемой гарантии КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. См. либо GNU General Public License, либо Artistic License для получения дополнительной информации.

Вы должны получить копию Artistic License вместе с этим набором в файле с именем "Artistic". Если нет, я с удовольствием предоставлю ее.

Вы также должны были получить копию Общественной лицензии GNU вместе с этой программой в файле с именем «Copying». Если нет, напишите в Фонд свободного программного обеспечения, Inc., 51 Franklin St, пятый этаж, Бостон, MA 02110-1301, США или посетите их веб-страницу в интернете по адресу http://www.gnu.org/copyleft/gpl.html.

Для тех из вас, кто выбирает использовать Общественную лицензию GNU, моя интерпретация Общественной лицензии GNU заключается в том, что никакой скрипт Perl не попадает под условия GPL, если вы не явно не поместите данный скрипт под условия GPL. Кроме того, любой объектный код, связанный с Perl, не автоматически попадает под условия GPL, при условии, что такой объектный код только добавляет определения подпрограмм и переменных и не препятствует выполнению стандартного скрипта Perl результирующим интерпретатором. Я считаю, что связывание C-подпрограмм таким образом является моральным эквивалентом определения подпрограмм на языке Perl. Вы можете продавать такой объектный файл как собственнический, при условии, что вы предоставите или предложите предоставить исходный код Perl, как указано в Общественной лицензии GNU. (Это просто альтернативный способ указания ввода в программу.) Вы также можете продавать двоичный файл, созданный путем выгрузки работающего скрипта Perl, принадлежащего вам, при условии, что вы предоставите или предложите предоставить исходный код Perl, как указано в GPL. (Факт, что интерпретатор Perl и ваш код находятся в одном двоичном файле, в этом случае является всего лишь агрегацией.) Это моя интерпретация GPL. Если у вас все еще есть вопросы или трудности с пониманием моего намерения, не стесняйтесь обратиться ко мне. Конечно, Художественная лицензия подробно излагает всё это для вашей защиты, поэтому вы можете предпочесть использовать её.

© 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/SelfLoader

Spec-Zone.ru

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