Современные
# библиотека подпрограмм 'music_lib.pl'
sub albums_by_artist { # найти альбомы указанного артиста
my ($artist) = @_; # аргумент поиска: артист
my @albums = (); # возвращаемый список
seek DATA, 0, 0; # ищем с начала файла
while (<DATA>) { # просматриваем альбомы в файле
push @albums, $1 if /$artist;(.+?);/; # и выбираем
} # все подходящие
return @albums; # результат: список альбомов
}
# ... другие подпрограммы библиотеки...
__DATA__ # конец библиотечного файла
Рассмотрим, как происходит обращение к библиотечным
Чтобы воспользоваться подпрограммой из библиотечного do '. do загружает любую do. Кроме этого, do регистрирует загруженные программы в специальном хэше %INC. Если do не может найти или прочитать undef и присваивает специальной переменной $! признак ошибки. Если do прочитала undef и помещает сообщение об ошибке в специальную переменную .$@. Если
После того как внешний
do 'lib/music_lib.pl'; # загрузить библиотеку
# вызвать библиотечную подпрограмму
my @albums = albums_by_artist('Elton John');
print "$_\n" foreach(@albums); # напечатать найденный список
Обратите внимание, что в нашем примере явно указан путь к подкаталогу с библиотекой, что предполагает запуск программы из определенного каталога. Гораздо лучше сделать так, чтобы расположение библиотек не зависело от местонахождения вызывающей программы. Для этого в @INC, в котором хранится -I, указываемой в
perl -I/Shock/Mike/lib program.pl
Тогда в программе можно указывать путь к библиотекам относительно одного из @INC каталогов:
do 'music_lib.pl'; # искать библиотеку в списке @INC
Другой способ добавить в @INC каталог для поиска загружаемых файлов - использовать use lib. Для этого в программе перед
use lib('/Shock/Mike/lib'); # добавить путь к списку @INC
do считается устаревшей и употребляется все реже и реже. Вместо нее применяется @INC, компилируется с ошибками или не возвращает истинного значения. Поэтому в конце загружаемого
# ... другие подпрограммы библиотеки... 1; # вернуть истинное значение для require __DATA__ # конец библиотечного файла
также регистрирует загруженные программы в специальном хэше %INC, поэтому не загружает их повторно. Однако использование библиотек и прочих
Пакеты используются в , за которой указывается
package Package; # объявить пакет с именем Package
, относятся к объявленному пакету. Действие распространяется до конца текущего блока, или до следующей , начинающей или продолжающей указанный в ней пакет. Каждое употребление __PACKAGE__ содержит имя текущего пакета. Поясним сказанное таким примером:
package Package; # начало пакета Package
$variable = 'переменная'; # скаляр из пакета Package
sub subroutine { # подпрограмма из пакета Package
return "$variable";
}
package Another; # начало пакета Another
$variable = 'переменная'; # скаляр из пакета Another
sub subroutine { # подпрограмма из пакета Another
return "$variable";
}
package Package; # продолжение пакета Package
@array = (1..5); # массив из пакета Package
В любом пакете можно обратиться к переменной или подпрограмме из другого пакета, указав ее :: разделяют эти две части таким образом:
$Package::variable - скалярная переменная из пакета Package $Another::variable - скалярная переменная из пакета Another Package::subroutine - подпрограмма из пакета Package Package::subroutine - префикс подпрограммы можно не писать
Если глобальные имена не описаны явно в составе какого-либо пакета, то по умолчанию они относятся к пакету main. Можно считать, что объявление этого пакета неявно присутствует в начале любой
%pseudo_name = ('Marylin Monroe' => 'Norma Jean');
print $main::pseudo_name{'Marylin Monroe'};
Следующие варианты записи имени обозначают одну и ту же переменную из пакета по умолчанию:
@main::array # с явным именем пакета main @::array # с пустым именем пакета @array # без имени пакета
Имена пакетов не применяются к лексическим переменным, объявленным с помощью функций my() и our() и существующим в собственном пространстве имен. Причем my(), не может распространяться за пределы исходного our(), видны в пределах пакета, даже если части пакета определены в разных программных файлах. Вот пример сосуществования одноименных
$variable = 'глобальная'; # переменная из пакета main my $variable = 'лексическая'; # переменная из текущего блока print "$main::variable $variable"; # будет напечатано: 'глобальная лексическая'
В . В этом случае имена пакетов образуют исходный
use lib("$path/lib"); # добавить путь к списку поиска
# загрузить внешнюю программу по имени файла
require 'Package/Subpackage/Program.pm';
Если в команде .pm. .pm используется для файлов, содержащих и use. Тогда предыдущую
# загрузить внешнюю программу по имени пакета require Package::Subpackage::Program; # вызвать подпрограмму из загруженного пакета print Package::Subpackage::Program::subroutine(), "\n";
Теперь рассмотрим другой способ обращения к внешним программам - подключение их на этапе
Хотя есть немало случаев, когда нужно загружать внешние программы во время выполнения программы, гораздо чаще библиотеки модулей
use Package::Subpackage::Module; # подключить модуль
С помощью use также use встретятся по ходу этой лекции при обсуждении работы с модулями.
и use также применяются для
use 5.005; # использовать версию Perl не ниже указанной require 5.008007; # использовать Perl 5.8.7 и выше
Если не выполняется требование, заданное в use, то
Модуль - это специальным образом оформленная библиотека подпрограмм, предназначенных для многократного использования. Модули появились в
package Module; # пространство имен модуля
use 5.006001; # использовать версию Perl не ниже указанной
use strict; # включить дополнительные проверки
use warnings; # и расширенную диагностику
our $VERSION = '1.00'; # версия модуля
require Exporter; # загрузить стандартный модуль Exporter
our @ISA = qw(Exporter); # неизвестные имена искать в нем
our @EXPORT = qw( subroutine );
# имена, экспортируемые по умолчанию
our @EXPORT_OK = qw( $variable );
# имена, экспортируемые по запросу
$Module::variable = 'переменная 1'; # скаляр из модуля Module
sub subroutine { # подпрограмма из модуля Module
return "'подпрограмма 1 $Module::variable'";
}
1;
__END__
Автоматически сгенерировать скелет нового модуля (а также сопутствующие файлы, необходимые для подготовки модуля к распространению) можно с помощью h2xs, входящей в состав дистрибутива ' версии 1.00 можно такой
h2xs -AX -n Module::Name -v 1.00
Если программа, которая обращается к этому модулю, использует только экспортированные по умолчанию имена, то используется use только с именем модуля:
use Module; # подключить модуль и # импортировать из него имена по умолчанию subroutine(); # вызвать подпрограмму Module::subroutine()
В программе, в которой нужно явно затребовать import ), применяется use со списком импортируемых имен:
use Module qw($variable); # затребовать импорт нужных имен print "$variable\n"; # скаляр $Module::variable
use является unimport для отмены импортированных имен. В команде use также можно проверить, что версия
use Module 1.00; # подключить модуль не ниже указанной версии
Помимо процедурного, модули могут иметь объектно-ориентированный
В каждой BEGIN, END, , . Каждый из таких блоков может присутствовать несколько раз в любом месте программы. Эти блоки вызываются автоматически в определенное время в начале и в конце выполнения
Блок BEGIN выполняется как можно раньше: во время BEGIN, то они выполняются в порядке их описания. Они используются use для загрузки
Блок END выполняется как можно позже: после того как END выполняются в порядке, обратном их размещению в END не выполняются, если при запуске Рerl заказана только -c ), или если END доступна специальная $?, содержащая
Блок выполняется после того, как Рerl закончил компиляцию программы. Можно определить несколько блоков , тогда они будут выполняться в порядке, обратном их описанию. Блоки выполняются, если Рerl запущен с опцией -c только для
Блок выполняется перед тем, как интерпретатор начнет выполнение программы, поэтому могут использоваться для выполняются в порядке их описания. Поясним последовательность выполнения специальных блоков на коротком примере:
print " 8. выполнение 1\n";
END { print "14. (1-й END)\n" }
INIT { print " 5. (1-й INIT)\n" }
CHECK { print " 4. (1-й CHECK)\n" }
print " 9. выполнение 2\n";
BEGIN { print " 1. (1-й BEGIN)\n" }
END { print "13. (2-й END)\n" }
CHECK { print " 3. (2-й CHECK)\n" }
INIT { print " 6. (2-й INIT)\n" }
print "10. выполнение 3\n";
END { print "12. (3-й END)\n" }
BEGIN { print " 2. (2-й BEGIN)\n" }
INIT { print " 7. (3-й INIT)\n" }
print "11. выполнение 4\n";
Сравните
Обычное выполнение: Только компиляция (perl -c) 1. (1-й BEGIN) 1. (1-й BEGIN) 2. (2-й BEGIN) 2. (2-й BEGIN) 3. (2-й CHECK) 3. (2-й CHECK) 4. (1-й CHECK) 4. (1-й CHECK) 5. (1-й INIT) 6. (2-й INIT) 7. (3-й INIT) 8. выполнение 1 9. выполнение 2 10. выполнение 3 11. выполнение 4 12. (3-й END) 13. (2-й END) 14. (1-й END)
Использование специальных блоков позволяет программисту гибко организовать
В поставке
perldoc perlmodlib
use. Встроенные системные функции находятся в специальном пакете , поэтому, если в
use Cwd 'chdir'; # подключить стандартный модуль chdir '/temp'; # вызвать Cwd::chdir() CORE::chdir '/temp'; # вызвать встроенную функцию chdir
, lib, , , utf8, и другие. Другая , CPAN, Cwd, , , , , , и многие другие.
Следующая
В лекции 1 уже шла речь о
Поэтому прежде, чем написать свою программу, имеет смысл поискать на CPAN модуль, подходящий для решения возникшей задачи. Во многих случаях "изобретать велосипед" не придется: найденный модуль либо можно сразу использовать, либо взять за основу своей разработки. Поскольку большинство современных
Когда требуемый модуль отсутствует в вашей системе, его можно установить из репозитория CPAN. Для этого нужно обратиться к одному из зеркал этого архивного сайта и загрузить с него последнюю версию модуля, которые по традиции распространяются в виде архивов в формате tar.gz.
Программисты, работающие с одной из операционных систем семейства Unix, могут устанавливать модули несколькими способами. Самый простой из них - воспользоваться утилитой cpan из дистрибутива
cpan -i Module::Name
При первом запуске этой
tar -zxvf Module-Name-1.00.tar.gz
Затем нужно выполнить в этом каталоге несколько команд, которые подготовят, протестируют и установят требуемый модуль. Эти
perl Makefile.PL make make test make install
Если все
То же самое можно выполнить и в среде Microsoft Windows. Для распаковки архивов нужно воспользоваться Windows-версиями архиваторов tar и gzip или WinRAR. Установка модулей, полностью написанных на cpan.
Еще проще под ОС Windows устанавливать готовые бинарные дистрибутивы модулей от компании ActiveState, ориентированные на систему '::' в имени модуля заменяются на '-' ):
ppm install Module-Name
Или можно загрузить архив с модулем вручную, после чего запустить установку из локального каталога без подключения к Internet. Адрес сервера для загрузки готовых ppd можно узнать на
Библиотеки, пакеты и модули, изученные в этой лекции, позволяют программисту рационально организовать собственные программы, когда они начинают разрастаться в объеме. А изученные приемы работы со стандартными библиотеками и дополнительными модулями помогут рационально воспользоваться компонентами, которые создали, отладили и протестировали другие разработчики.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.