Модуль Perl - Perl module
А Модуль Perl является дискретной составляющей программного обеспечения для Perl язык программирования. Технически это особый набор условности для использования Механизм пакетов Perl это стало общепринятым.[обсуждать]
Модуль определяет свой исходный код быть в упаковка (очень похоже на Пакет Java ), Perl-механизм для определения пространства имен, например CGI или же Сеть :: FTP или же XML :: Парсер; файловая структура отражает пространство имен структура (например, исходный код для Сеть :: FTP в Сеть / FTP.pm). Кроме того, модуль - это Perl-эквивалент модуля учебный класс когда объектно-ориентированного программирования Используется.[обсуждать]
Сборник модулей с сопутствующими документация, сценарии сборки, и обычно тестирование, составляет распределение. Сообщество Perl имеет обширную библиотеку дистрибутивов, доступных для поиска и загрузки через CPAN.
Perl - это язык, допускающий множество различных стилей программирования. Разработчик может найти модуль, написанный на процедурный стиль (например, Тест :: Простой ) в качестве объектно-ориентированный (например. XML :: Парсер ), оба считаются одинаково допустимыми в зависимости от того, что модуль должен делать. Модули также могут использоваться для миксин методы (DBIx :: Класс ) или быть прагма (strict.pm ), который действует сразу после загрузки. Модули можно использовать даже для изменения синтаксиса языка. Эффект модулей Perl обычно ограничивается текущим объем в котором он был загружен.
Модули Perl обычно имеют встроенную документацию в Perl's Обычная старая документация формат. POD мало структурирует автора. Он достаточно гибкий, чтобы его можно было использовать для написания статей, веб-страниц и даже целых книг, таких как Программирование на Perl. Контраст с javadoc который специализируется на документировании Ява классы. По соглашению, документация модуля обычно следует структуре Справочная страница Unix.
Язык Perl определяется единственной реализацией (именуемой «perl») и добавляется (а в редких случаях удаляется) в каждый новый выпуск. По этой причине автору модуля важно знать, какие функции они используют и какова минимально необходимая версия perl. Для кода на этой странице требуется perl 5.6.0, который сейчас считается довольно старым.
Примеры
Ниже приведены примеры "Привет, мир "реализованы в разных стилях модулей. Следует понимать, что модуль не требуется в Perl; функции и код можно определять и использовать где угодно. Это просто для примера. В отличие от Ява где всегда нужен класс. Настоящая функция «Hello, World» будет записана так:
суб Привет { "Привет, мир! N" }Распечатать Привет();
или просто напечатайте в одну строку:
Распечатать "Привет, мир! N";
Пример процедуры
Вот "Hello, World", реализованный как процедурный модуль с настраиваемой целью для приветствия, просто чтобы сделать вещи интересными. Также прилагается короткий сценарий для иллюстрации использования модуля.
hello_world.pl
#! / usr / bin / perl# Загружает модуль и импортирует любые функции в наше пространство имен # (по умолчанию "main") экспортируется модулем. Привет :: Мировой экспорт# hello () по умолчанию. Экспорт обычно может контролироваться вызывающей стороной.использовать Привет, мир;Распечатать Привет(); # выводит "Hello, world! n"Распечатать Привет("Млечный Путь"); # выводит сообщение "Привет, Млечный Путь! n"
Привет / World.pm
# "package" - это пространство имен, в котором находятся функциональные возможности / данные модуля. # Он определяет имя файла, если вы хотите, чтобы он был "использован" d.# Если более одного слова, это ограничивает расположение модуля.упаковка Привет, мир;# По умолчанию Perl позволяет использовать переменные без объявления # их. Это может быть удобно для коротких скриптов и однострочников.# Но в более длинном блоке кода, таком как модуль, разумно объявить # ваши переменные как для обнаружения опечаток, так и для ограничения их # доступность извне модуля. Строгая прагма# заставляет вас объявлять переменные. использовать строгий; # Точно так же Perl по умолчанию не выдает большинство предупреждений компилятора или времени выполнения.# Более сложные скрипты, такие как большинство модулей, обычно очень # полезно для отладки. Прагма warnings включает необязательные предупреждения. использовать предупреждения; # Номер версии модуля хранится в $ ModuleName :: VERSION; определенный # формы встроенного "использования" зависят от определения этой переменной.наш $ ВЕРСИЯ = '1.00';# Наследование от модуля «Экспортер», который обрабатывает функции экспорта.# Большинство процедурных модулей используют это.использовать основание 'Экспортер';# Когда модуль вызывается, экспортировать по умолчанию функцию "hello" в # пространство имен используемого кода.наш @EXPORT = qw (привет);# Строки, начинающиеся со знака равенства, указывают на встроенный POD # документация. Разделы POD заканчиваются директивой = cut и могут # почти беспрепятственно смешивать с обычным кодом.= head1 ИМЯHello :: World - инкапсуляция общего выходного сообщения= head1 ОБЗОР используйте Hello :: World; напечатать привет (); распечатать привет («Млечный путь»);= head1 ОПИСАНИЕЭто процедурный модуль, который дает вам знаменитое «Hello, world!»сообщение, и его даже можно настроить!= head2 ФункцииСледующие функции экспортируются по умолчанию= head3 привет напечатать привет (); распечатать привет ($ target);Возвращает известное приветствие. Если указан C <$ target>, он будет использован,в противном случае цель вашего приветствия - "мир".= вырезать# определяем функцию hello ().суб Привет { мой $ цель = сдвиг; $ цель = 'Мир' пока не определенный $ цель; возвращаться "Привет, $ target! N";}= head1 АВТОРДжо Хакер = вырезать# Модуль Perl должен заканчиваться истинным значением, иначе считается, что он не# загрузились. По соглашению это значение обычно равно 1, хотя может быть# любое истинное значение. Модуль может заканчиваться ложью, чтобы указать на сбой, но# используется редко и вместо этого будет die () (завершится с ошибкой).1;
Поскольку Hello / World.pm отсутствует в вашем пути @INC, вы должны указать. в командной строке, чтобы запустить приведенный выше пример:
perl -I. hello_world.pl
Объектно-ориентированный пример
Вот пример того же самого, сделанного в объектно-ориентированном стиле. Преимущество объектно-ориентированного модуля состоит в том, что каждый объект может быть настроен независимо от других объектов.
hello_world.pl
#! / usr / bin / perlиспользовать Привет, мир;мой $ привет = Привет, мир->новый;$ привет->Распечатать; # выводит "Hello, world! n"$ привет->цель("Млечный Путь");$ привет->Распечатать; # выводит сообщение "Привет, Млечный Путь! n"мой $ приветствие = Привет, мир->новый(цель => "Питтсбург");$ приветствие->Распечатать; # вывод "Привет, Питтсбург! n"$ привет->Распечатать; # все еще печатает "Привет, Млечный Путь! n"
Привет / World.pm
# В Perl нет специального определения «класса». Пространство имен - это класс.упаковка Привет, мир;использовать строгий;использовать предупреждения; наш $ ВЕРСИЯ = "1.00";= head1 ИМЯHello :: World - инкапсуляция общего выходного сообщения= head1 ОБЗОР используйте Hello :: World; мой $ hello = Hello :: World-> new (); $ hello-> печать;= head1 ОПИСАНИЕЭто объектно-ориентированная библиотека, которая может печатать знаменитый "H.W."сообщение.= head2 Методы= head3 новый мой $ hello = Hello :: World-> new (); мой $ hello = Hello :: World-> new (target => $ target);Создает экземпляр объекта, который содержит приветственное сообщение. Если C <$ target>учитывая, что он передается в C << $ hello-> target >>.= вырезать # Конструктор объекта по соглашению называется new (). Любой# метод может создавать объект, и вы можете иметь их сколько угодно. суб новый { мой($ класс, % args) = @_; мой $ self = благословить({}, $ класс); мой $ цель = существуют $ args{цель} ? $ args{цель} : "Мир"; $ self->{цель} = $ цель; возвращаться $ self;} = head3 target моя $ target = $ hello-> target; $ hello-> target ($ target);Получает и устанавливает текущую цель нашего сообщения.= вырезать суб цель { мой $ self = сдвиг; если ( @_ ) { мой $ цель = сдвиг; $ self->{цель} = $ цель; } возвращаться $ self->{цель};} = head3 to_string мое приветствие = $ hello-> to_string;Возвращает приветствие $ в виде строки= вырезать суб нанизывать { мой $ self = сдвиг; возвращаться "Привет, $ self -> {target}!";} = head3 print $ hello-> печать;Вывод приветствия в STDOUT= вырезать суб Распечатать { мой $ self = сдвиг; Распечатать $ self->нанизывать(), " п";} = head1 АВТОРДжо Хакер = вырезать 1;
Пакеты и пространства имен Perl
Работающая программа Perl имеет встроенную пространство имен называется "главный
", которое является именем по умолчанию. Например, подпрограмма с именем Sub1
можно назвать Sub1 ()
или же main :: Sub1 ()
. С переменной соответствующий сигил помещается перед пространством имен; поэтому скалярная переменная называется $ var1
также может называться $ main :: var1
, или даже $ :: var1
. Другие пространства имен могут быть созданы в любое время.
упаковка Пространство имен1;$ var1 = 1; # создается в пространстве имен Namespace1, которое также создается, если не существует ранеенаш $ var2 = 2; # также создается в этом пространстве имен; наш требуется, если применяется строгое использованиемой $ var3 = 3; # с лексической областью видимости my-declare - НЕ в любом пространстве имен, даже в основном
$Пространство имен2 ::var1 = 10; # создается в пространстве имен Namespace2, также создается, если не существует ранеенаш $Пространство имен2 ::var2 = 20; # также создан в этом пространстве именмой $Пространство имен2 ::var3 = 30;# ошибка компиляции: объявленные мной переменные НЕ МОГУТ принадлежать пакету
Объявления пакетов применяют область действия пакета до следующего объявления пакета или до конца блока, в котором сделано объявление.
наш $ mainVar = 'а';упаковка Sp1;наш $ sp1aVar = 'аа';Распечатать "$ main :: mainVar t $ sp1aVar n"; # note mainVar требует квалификацииупаковка Sp2;наш $ sp2aVar = 'ааа';Распечатать "$ main :: mainVar t $ Sp1 :: sp1aVar t $ sp2aVar n";# обратите внимание, что mainVar и sp1aVar требуют квалификацииупаковка главный;Распечатать "$ mainVar t $ Sp1 :: sp1aVar t $ Sp2 :: sp2aVar n"; # обратите внимание, что sp1aVar и sp2aVar требуют квалификации$ mainVar = 'b';{ # ПРИМЕЧАНИЕ: ранее созданные пакеты и переменные пакетов все еще доступны упаковка Sp1; наш $ sp1bVar = 'bb'; Распечатать "$ main :: mainVar t $ sp1aVar t $ sp1bVar n"; # note mainVar требует квалификации { упаковка Sp2; наш $ sp2bVar = 'bbb'; Распечатать "$ main :: mainVar t $ Sp1 :: sp1aVar $ Sp1 :: sp1bVar t $ sp2aVar $ sp2bVar n"; } # обратите внимание, что mainVar и sp1 ... Var нуждается в квалификации Распечатать "$ main :: mainVar t $ sp1bVar $ sp1aVar t $ Sp2 :: sp2bVar $ Sp2 :: sp2aVar n";} # note package Sp1 применяется по умолчанию# main снова применяется по умолчанию; все переменные пакета по-прежнему доступны, если они указаныРаспечатать "$ mainVar t $ Sp1 :: sp1aVar $ Sp2 :: sp2bVar n";
Пакеты и модули
Обычно пространства имен связаны с модулями; на практике обычно существует одно пространство имен для каждого модуля и наоборот, но это не предусмотрено языком. Например, «стандартный» модуль CGI.pm имеет следующее объявление вверху:
упаковка CGI;
Этот модуль и его функциональные возможности обычно вызываются следующим образом:
использовать CGI (': стандартный'); # импортирует множество функций, включая b ()...Распечатать б('Привет, мир'); # выходов Hello, world
'Отсутствующая' подпрограмма мог быть добавленным из пространства имен использующей программы.
суб CGI:: bi { # определить целевое пространство имен (CGI) и под-имя (bi) возвращаться б(я($_[0]));}
и вызывается, как показано ниже:
Распечатать CGI ::би('Привет, мир'); # выходов Hello, world
Однако, хотя это технически осуществимо, это было бы сомнительной практикой программирования. С таким же успехом вы можете определить подпрограмму в вызывающем пространстве имен и вызывать ее из этого пространства имен.