Инструкция пакета переключает текущий контекст именования в указанное пространство имен (таблица символов). Таким образом —
-
Пакет — это набор кода, который находится в своем собственном пространстве имен.
-
Пространство имен — это именованная коллекция уникальных имен переменных (также называемая таблицей символов).
-
Пространства имен предотвращают конфликты имен переменных между пакетами.
-
Пакеты позволяют создавать модули, которые при использовании не будут перекрывать переменные и функции вне собственного пространства имен модулей.
-
Пакет остается в силе до тех пор, пока не будет вызван другой оператор пакета, или до конца текущего блока или файла.
-
Вы можете явно ссылаться на переменные в пакете, используя спецификатор :: package.
Пакет — это набор кода, который находится в своем собственном пространстве имен.
Пространство имен — это именованная коллекция уникальных имен переменных (также называемая таблицей символов).
Пространства имен предотвращают конфликты имен переменных между пакетами.
Пакеты позволяют создавать модули, которые при использовании не будут перекрывать переменные и функции вне собственного пространства имен модулей.
Пакет остается в силе до тех пор, пока не будет вызван другой оператор пакета, или до конца текущего блока или файла.
Вы можете явно ссылаться на переменные в пакете, используя спецификатор :: package.
Ниже приведен пример, содержащий пакеты main и Foo в файле. Здесь для печати имени пакета используется специальная переменная __PACKAGE__.
#!/usr/bin/perl # This is main package $i = 1; print "Package name : " , __PACKAGE__ , " $i\n"; package Foo; # This is Foo package $i = 10; print "Package name : " , __PACKAGE__ , " $i\n"; package main; # This is again main package $i = 100; print "Package name : " , __PACKAGE__ , " $i\n"; print "Package name : " , __PACKAGE__ , " $Foo::i\n"; 1;
Когда приведенный выше код выполняется, он дает следующий результат —
Package name : main 1 Package name : Foo 10 Package name : main 100 Package name : main 10
Начало и конец блоков
Вы можете определить любое количество блоков кода с именами BEGIN и END, которые действуют как конструкторы и деструкторы соответственно.
BEGIN { ... } END { ... } BEGIN { ... } END { ... }
-
Каждый блок BEGIN выполняется после загрузки и компиляции сценария perl, но перед выполнением любого другого оператора.
-
Каждый блок END выполняется непосредственно перед выходом из интерпретатора perl.
-
Блоки BEGIN и END особенно полезны при создании модулей Perl.
Каждый блок BEGIN выполняется после загрузки и компиляции сценария perl, но перед выполнением любого другого оператора.
Каждый блок END выполняется непосредственно перед выходом из интерпретатора perl.
Блоки BEGIN и END особенно полезны при создании модулей Perl.
Следующий пример показывает его использование —
#!/usr/bin/perl package Foo; print "Begin and Block Demo\n"; BEGIN { print "This is BEGIN Block\n" } END { print "This is END Block\n" } 1;
Когда приведенный выше код выполняется, он дает следующий результат —
This is BEGIN Block Begin and Block Demo This is END Block
Что такое Perl-модули?
Модуль Perl — это повторно используемый пакет, определенный в библиотечном файле, имя которого совпадает с именем пакета с расширением .pm.
Файл модуля Perl с именем Foo.pm может содержать такие выражения.
#!/usr/bin/perl package Foo; sub bar { print "Hello $_[0]\n" } sub blat { print "World $_[0]\n" } 1;
Несколько важных моментов о модулях Perl
-
Функции требуют и используют загрузит модуль.
-
Оба используют список путей поиска в @INC, чтобы найти модуль.
-
Обе функции требуют и используют функцию eval для обработки кода.
-
1; в нижней части приводит к тому, что eval оценивается как TRUE (и, следовательно, не терпит неудачу)
Функции требуют и используют загрузит модуль.
Оба используют список путей поиска в @INC, чтобы найти модуль.
Обе функции требуют и используют функцию eval для обработки кода.
1; в нижней части приводит к тому, что eval оценивается как TRUE (и, следовательно, не терпит неудачу)
Требуемая функция
Модуль можно загрузить, вызвав функцию require следующим образом:
#!/usr/bin/perl require Foo; Foo::bar( "a" ); Foo::blat( "b" );
Вы, должно быть, заметили, что имена подпрограмм должны быть полностью квалифицированы для их вызова. Было бы неплохо разрешить импорт подпрограммы и blat в наше собственное пространство имен, чтобы нам не пришлось использовать квалификатор Foo ::.
Функция использования
Модуль можно загрузить, вызвав функцию use .
#!/usr/bin/perl use Foo; bar( "a" ); blat( "b" );
Обратите внимание, что нам не нужно было полностью определять имена функций пакета. Функция use экспортирует список символов из модуля с учетом нескольких добавленных операторов внутри модуля.
require Exporter; @ISA = qw(Exporter);
Затем предоставьте список символов (скаляры, списки, хэши, подпрограммы и т. Д.), Заполнив переменную списка с именем @EXPORT : Например —
package Module; require Exporter; @ISA = qw(Exporter); @EXPORT = qw(bar blat); sub bar { print "Hello $_[0]\n" } sub blat { print "World $_[0]\n" } sub splat { print "Not $_[0]\n" } # Not exported! 1;
Создайте дерево модулей Perl
Когда вы будете готовы отправить свой модуль Perl, тогда существует стандартный способ создания дерева модулей Perl. Это делается с помощью утилиты h2xs . Эта утилита поставляется вместе с Perl. Вот синтаксис для использования h2xs —
$h2xs -AX -n ModuleName
Например, если ваш модуль доступен в файле Person.pm , просто введите следующую команду:
$h2xs -AX -n Person
Это даст следующий результат —
Writing Person/lib/Person.pm Writing Person/Makefile.PL Writing Person/README Writing Person/t/Person.t Writing Person/Changes Writing Person/MANIFEST
Вот описание этих опций —
-
-A пропускает код автозагрузчика (лучше всего используется модулями, которые определяют большое количество редко используемых подпрограмм).
-
-X пропускает элементы XS (подпрограмма eXternal, где eXternal означает внешний по отношению к Perl, т. Е. C).
-
-n указывает имя модуля.
-A пропускает код автозагрузчика (лучше всего используется модулями, которые определяют большое количество редко используемых подпрограмм).
-X пропускает элементы XS (подпрограмма eXternal, где eXternal означает внешний по отношению к Perl, т. Е. C).
-n указывает имя модуля.
Таким образом, команда выше создает следующую структуру внутри директории Person. Фактический результат показан выше.
- изменения
- Makefile.PL
- MANIFEST (содержит список всех файлов в пакете)
- ПРОЧТИ МЕНЯ
- т / (тестовые файлы)
- lib / (Актуальный исходный код находится здесь
Итак, наконец, вы упаковываете эту структуру каталогов в файл Person.tar.gz и можете отправить его. Вам нужно будет обновить файл README с соответствующими инструкциями. Вы также можете предоставить некоторые примеры тестовых файлов в каталоге t.
Установка модуля Perl
Загрузите модуль Perl в виде файла tar.gz. Используйте следующую последовательность, чтобы установить любой Perl Module Person.pm, который был загружен в виде файла Person.tar.gz .
tar xvfz Person.tar.gz cd Person perl Makefile.PL make make install
Интерпретатор Perl имеет список каталогов, в которых он ищет модули (глобальный массив @INC).