Spec-Zone.ru › Perl 5.34

autouse

СОДЕРЖАНИЕ

  • ИМЯ
  • СИНТАКСИС
  • ОПИСАНИЕ
  • ПРЕДУПРЕЖДЕНИЕ
  • АВТОР
  • СМОТРИ ТАКЖЕ

ИМЯ

autouse - отложить загрузку модулей до использования функции

СИНТАКСИС

use autouse 'Carp' => qw(carp croak);
carp "this carp was predeclared and autoused ";

ОПИСАНИЕ

Если модуль Module уже загружен, то объявление

use autouse 'Module' => qw(func1 func2($;$));

эквивалентно

use Module qw(func1 func2);

если Module определяет func2() с прототипом ($;$), а func1() не имеет прототипов. (По крайней мере, если Module использует Exporter's import, в противном случае это ошибка.)

Если модуль Module ещё не загружен, то вышеуказанное объявление объявляет функции func1() и func2() в текущем пакете. При вызове этих функций они загружают пакет Module при необходимости и заменяют себя правильными определениями.

ПРЕДУПРЕЖДЕНИЕ

Использование autouse перенесёт важные шаги выполнения вашей программы из времени компиляции во время выполнения. Это может

  • нарушить выполнение вашей программы, если модуль, который вы autouseли, имеет некоторую инициализацию, которую он ожидает выполнить рано.

  • скрыть ошибки в вашем коде, поскольку важные проверки (например, правильность прототипов) переносятся из времени компиляции во время выполнения. В частности, если указанный вами прототип на строке autouse неверный, вы об этом не узнаете, пока соответствующая функция не будет выполнена. Это будет очень неудачно для функций, которые не всегда вызываются (обратите внимание, что для таких функций autouse даёт наибольший выигрыш, для обходного решения см. ниже).

Чтобы частично устранить вторую проблему, рекомендуется писать ваши скрипты так:

use Module;
use autouse Module => qw(carp($) croak(&$));
carp "this carp was predeclared and autoused ";

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

АВТОР

Илья Захаревич (ilya@math.ohio-state.edu)

СМОТРИ ТАКЖЕ

perl(1).

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

Spec-Zone.ru

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