Учебники

Perl — пакеты и модули

Инструкция пакета переключает текущий контекст именования в указанное пространство имен (таблица символов). Таким образом —

  • Пакет — это набор кода, который находится в своем собственном пространстве имен.

  • Пространство имен — это именованная коллекция уникальных имен переменных (также называемая таблицей символов).

  • Пространства имен предотвращают конфликты имен переменных между пакетами.

  • Пакеты позволяют создавать модули, которые при использовании не будут перекрывать переменные и функции вне собственного пространства имен модулей.

  • Пакет остается в силе до тех пор, пока не будет вызван другой оператор пакета, или до конца текущего блока или файла.

  • Вы можете явно ссылаться на переменные в пакете, используя спецификатор :: package.

Пакет — это набор кода, который находится в своем собственном пространстве имен.

Пространство имен — это именованная коллекция уникальных имен переменных (также называемая таблицей символов).

Пространства имен предотвращают конфликты имен переменных между пакетами.

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

Пакет остается в силе до тех пор, пока не будет вызван другой оператор пакета, или до конца текущего блока или файла.

Вы можете явно ссылаться на переменные в пакете, используя спецификатор :: package.

Ниже приведен пример, содержащий пакеты main и Foo в файле. Здесь для печати имени пакета используется специальная переменная __PACKAGE__.

Live Demo

#!/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.

Следующий пример показывает его использование —

Live Demo

#!/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).