stringtranslate.com

Perl-модуль

Схема механизма использования модулей Perl.

Модуль Perl — это дискретный компонент программного обеспечения для языка программирования Perl . Технически, это определенный набор соглашений по использованию механизма пакетов Perl, который стал общепринятым. [ обсудить ]

Модуль определяет свой исходный код как находящийся в пакете (подобно пакету Java ), механизм Perl для определения пространств имен , например CGI или Net::FTP или XML::Parser ; структура файла отражает структуру пространства имен (например, исходный код для Net::FTP находится в Net/FTP.pm ). Более того, модуль является эквивалентом Perl класса , когда используется объектно-ориентированное программирование . [ обсудить ]

Набор модулей с сопутствующей документацией , скриптами сборки и, как правило , тестовым набором составляет дистрибутив . Сообщество Perl имеет большую библиотеку дистрибутивов, доступных для поиска и загрузки через CPAN .

Perl — это язык, допускающий множество различных стилей программирования. Разработчик с одинаковой вероятностью найдет модуль, написанный в процедурном стиле (например, Test::Simple), а также в объектно-ориентированном (например, XML::Parser), оба считаются одинаково допустимыми в зависимости от того, что должен делать модуль. Модули также могут использоваться для подмешивания методов (DBIx::Class) или быть прагмой (strict.pm), которая вступает в силу немедленно после загрузки. Модули могут даже использоваться для изменения синтаксиса языка. Эффект модулей Perl обычно ограничивается текущей областью действия , в которой он был загружен.

Модули Perl обычно имеют встроенную документацию в формате Perl's Plain Old Documentation . POD не навязывает автору особой структуры. Он достаточно гибок, чтобы его можно было использовать для написания статей, веб-страниц и даже целых книг, таких как Programming Perl. В отличие от javadoc , который специализируется на документировании классов Java . По соглашению документация модулей обычно следует структуре страницы руководства Unix .

Язык Perl определяется единственной реализацией (называемой «perl») и добавляется (и в редких случаях удаляется) к каждому новому релизу. По этой причине автору модуля важно знать, какие функции он использует и какова минимальная требуемая версия perl. Код на этой странице требует perl 5.6.0, который сейчас считается довольно старым.

Примеры

Далее следуют примеры " Hello, World ", реализованные в различных стилях модулей. Необходимо понимать, что модуль не является обязательным в Perl; функции и код могут быть определены и использованы где угодно. Это только для примера. Сравните с Java , где класс всегда необходим. Настоящая функция "Hello, World" будет записана так:

sub hello { "Привет, мир!\n" } print hello ();     

или просто напечатать в одну строку:

распечатать "Привет, мир!\n" ; 

Пример процедуры

Вот "Hello, World", реализованный как процедурный модуль с настраиваемой целью для приветствия, просто чтобы сделать вещи интереснее. Также включен короткий скрипт для иллюстрации использования модуля.

hello_world.pl

#!/usr/bin/perl # Загружает модуль и импортирует любые функции в наше пространство имен # (по умолчанию "main"), экспортируемое модулем. Hello::World экспортирует # hello() по умолчанию. Экспорт обычно может контролироваться вызывающей стороной. use Hello::World ; print hello (); # печатает "Привет, мир!\n" print hello ( "Млечный Путь" ); # печатает "Привет, Млечный Путь!\n"    

Привет/Мир.pm

# "package" — это пространство имен, в котором находятся функциональные возможности/данные модуля. # Оно определяет имя файла, если вы хотите, чтобы он был "использован". # Если указано более одного слова, оно ограничивает местоположение модуля.пакет Hello::World ; # По умолчанию Perl позволяет использовать переменные без их # объявления. Это может быть удобно для коротких скриптов и однострочных # программ. # Но в более длинной единице кода, такой как модуль, разумно объявлять # переменные как для обнаружения опечаток, так и для ограничения их # доступности соответствующим образом извне модуля. Прагма strict # заставляет вас объявлять переменные. use strict ; # Аналогично, Perl по умолчанию не выдает большинство предупреждений компилятора или времени выполнения. # Более сложные скрипты, такие как большинство модулей, обычно находят их очень # полезными для отладки. Прагма warnings включает необязательные предупреждения. use warnings ; # Номер версии модуля хранится в $ModuleName::VERSION; некоторые # формы встроенной функции "use" зависят от определения этой переменной.      наша $VERSION = '1.00' ;   # Наследуется от модуля "Exporter", который обрабатывает функции экспорта. # Большинство процедурных модулей используют это.использовать базу «Экспортер» ;  # При вызове модуля экспортируйте по умолчанию функцию "hello" в # пространство имен используемого кода.наш @EXPORT = qw(привет) ;   # Строки, начинающиеся со знака равенства, указывают на встроенную документацию POD. Разделы POD заканчиваются директивой =cut и могут # практически свободно смешиваться с обычным кодом.=head1 ИМЯHello::World — инкапсуляция общего выходного сообщения=head1 СИНТАКСИС использовать Hello::World;  print hello();  print hello("Млечный Путь");=head1 ОПИСАНИЕЭто процедурный модуль, который выводит знаменитое сообщение «Привет, мир!», и его даже можно настраивать!=head2 ФункцииСледующие функции экспортируются по умолчанию=head3 привет распечатать привет();  распечатать привет($target);Возвращает известное приветствие. Если задан C<$target>, он будет использован, в противном случае целью вашего приветствия будет "world".=вырезать# определяем функцию hello().sub hello { my $target = shift ; $target = 'world' если не определено $target ; return "Привет, $target!\n" ; }               =head1 АВТОРДжо Хакер <[email protected]>=вырезать# Модуль Perl должен заканчиваться значением true, иначе он считается # не загруженным. По соглашению это значение обычно равно 1, хотя может быть любым # значением true. Модуль может заканчиваться значением false, чтобы указать на сбой, но # это используется редко, и вместо этого он бы die() (выход с ошибкой). 1 ;

Поскольку Hello/World.pm отсутствует в вашем пути @INC, необходимо указать . в командной строке для запуска приведенного выше примера:

perl -I. hello_world.pl

Объектно-ориентированный пример

Вот пример того же самого, выполненного в объектно-ориентированном стиле. Преимущество ОО-модуля в том, что каждый объект может быть настроен независимо от других объектов.

hello_world.pl

#!/usr/bin/perluse Hello::World ; my $hello = Hello::World -> new ; $hello -> print ; # печатает "Привет, мир!\n" $hello -> target ( "Млечный Путь" ); $hello -> print ; # печатает "Привет, Млечный Путь!\n"      my $greeting = Hello::World -> new ( target => "Pittsburgh" ); $greeting -> print ; # печатает "Привет, Питтсбург!\n" $hello -> print ; # все еще печатает "Привет, Млечный Путь!\n"       

Привет/Мир.pm

# В Perl нет специального определения 'class'. Пространство имен — это класс. package Hello::World ; использовать строгий ; использовать предупреждения ; наш $VERSION = "1.00" ;      =head1 НАЗВАНИЕ Hello::World - Инкапсуляция общего выходного сообщения =head1 СИНТАКСИС  use Hello::World;  my $hello = Hello::World->new();  $hello->print; =head1 ОПИСАНИЕ Это объектно-ориентированная библиотека, которая может печатать знаменитое сообщение "HW". =head2 Методы =head3 new  my $hello = Hello::World->new();  my $hello = Hello::World->new( target => $target ); Создает экземпляр объекта, который содержит приветственное сообщение. Если указан C<$target>, он передается в C<< $hello->target >>. =cut # Конструктор объекта по соглашению называется new(). Любой метод может # создать объект, и их может быть столько, сколько вам нужно. sub new { my ( $class , %args ) = @_ ; my $self = bless ({}, $class ); my $target = exist $args { target } ? $args { target } : "world" ; $self -> { target } = $target ; return $self ; } =head3 target  my $target = $hello->target;  $hello->target($target); Получает и задает текущую цель нашего сообщения. =cut sub target { my $self = shift ; if ( @_ ) { my $target = shift ; $self -> { target } = $target ; }                                                                  return $self -> { target }; } =head3 to_string  my $greeting = $hello->to_string; Возвращает $greeting в виде строки =cut sub to_string { my $self = shift ; return "Привет, $self->{target}!" ; } =head3 print  $hello->print; Выводит приветствие в STDOUT =cut sub print { my $self = shift ; print $self -> to_string (), "\n" ; } =head1 АВТОР Джо Хакер <[email protected]> =cut 1 ;                                  

Пакеты и пространства имен Perl

Работающая программа Perl имеет встроенное пространство имен , называемое " main", которое является именем по умолчанию. Например, подпрограмма с именем Sub1может быть вызвана как Sub1()или main::Sub1(). В случае переменной соответствующий сигил помещается перед пространством имен; поэтому скалярная переменная с именем $var1может также называться как $main::var1, или даже $::var1. Другие пространства имен могут быть созданы в любое время.

package Namespace1 ; $var1 = 1 ; # создано в пространстве имен Namespace1, которое также создается, если не существует ранее our $var2 = 2 ; # также создается в этом пространстве имен; our required, если применяется use strict my $var3 = 3 ; # лексически ограниченный my-declared - НЕ в каком-либо пространстве имен, даже не в main         
$ Namespace2:: var1 = 10 ; # создано в пространстве имен Namespace2, также создается, если ранее не существовало our $ Namespace2:: var2 = 20 ; # также создается в этом пространстве имен my $ Namespace2:: var3 = 30 ; #ошибка компиляции: объявленные мной переменные НЕ МОГУТ принадлежать пакету          

Объявления пакетов применяют область действия пакета до следующего объявления пакета или до конца блока, в котором сделано объявление.

our $mainVar = 'a' ; package Sp1 ; our $sp1aVar = 'aa' ; print "$main::mainVar\t$sp1aVar\n" ; # обратите внимание, что mainVar требует квалификации пакета Sp2 ; our $sp2aVar = 'aaa' ; print "$main::mainVar\t$Sp1::sp1aVar\t$sp2aVar\n" ; # обратите внимание, что mainVar и sp1aVar требуют квалификации пакета main ; print "$mainVar\t$Sp1::sp1aVar\t$Sp2::sp2aVar\n" ; # обратите внимание, что sp1aVar и sp2aVar требуют квалификации                 $mainVar = 'b' ; { # ЗАМЕТЬТЕ, что ранее созданные пакеты и переменные пакетов по-прежнему доступны package Sp1 ; our $sp1bVar = 'bb' ; print "$main::mainVar\t$sp1aVar\t$sp1bVar\n" ; # обратите внимание, что mainVar требует квалификации { package Sp2 ; our $sp2bVar = 'bbb' ; print "$main::mainVar\t$Sp1::sp1aVar$Sp1::sp1bVar\t$sp2aVar$sp2bVar\n" ; } # обратите внимание, что mainVar и sp1...Var требуют квалификации print "$main::mainVar\t$sp1bVar$sp1aVar\t$Sp2::sp2bVar$Sp2::sp2aVar\n" ; } # обратите внимание, что package Sp1 применяется по умолчанию # main применяется снова по умолчанию; все переменные пакета остаются доступными, пока квалифицированы print "$mainVar\t$Sp1::sp1aVar$Sp2::sp2bVar\n" ;                         

Пакеты и модули

Традиционно пространства имен связаны с модулями; на практике обычно существует одно пространство имен на модуль и наоборот, но это не предписано языком. Например, «стандартный» модуль CGI.pm имеет следующее объявление в верхней части:

пакет CGI ; 

Этот модуль и его функциональные возможности обычно вызываются следующим образом:

use CGI ( ':standard' ); # импортирует много функций, включая b() ... print b ( 'Hello, world' ); # выводит <b>Hello, world</b>     

«Отсутствующая» подпрограмма может быть добавлена ​​из пространства имен использующей программы.

sub CGI ::bi { # определить целевое пространство имен (CGI) и имя подкласса (bi) return b ( i ( $_ [ 0 ])); }    

и вызывается следующим образом:

print CGI:: bi ( 'Привет, мир' ); # выводит <b><i>Привет, мир</i></b>  

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

Дальнейшее чтение