Чтение онлайн

на главную - закладки

Жанры

Язык программирования Perl

Шохирев Михаил Васильевич

Шрифт:

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

В любом пакете можно обратиться к переменной или подпрограмме из другого пакета, указав ее полное имя. Полное имя (или квалифицированное имя) каждого нединамического программного объекта в Perl состоит из имени пакета и идентификатора. Символы :: разделяют эти две части таким образом:

$Package::variable - скалярная переменная из пакета Package

$Another::variable - скалярная переменная из пакета Another

&Package::subroutine - подпрограмма из пакета Package

Package::subroutine - префикс подпрограммы можно не писать

Если глобальные имена не описаны явно в составе какого-либо пакета, то по умолчанию они относятся к пакету main. Можно считать, что объявление этого пакета неявно присутствует в начале любой Perl-программы. Поэтому упоминавшиеся до сих пор глобальные переменные, в том числе большинство специальных, на самом деле относятся к этому пакету. Имя пакета 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";

# будет напечатано: 'глобальная лексическая'

В Perl допускается использование пакетов, которые имеют составные имена следующего вида: Package::Subpackage. В этом случае имена пакетов образуют иерархию, а исходные файлы должны храниться в соответствующих вложенных каталогах. Составные имена пакетов соответствуют пути, по которому компилятор будет искать файл с исходным текстом программы. Загружать командой require исходный файл можно по полному имени файла с указанием подкаталогов, например:

use lib("$path/lib"); # добавить путь к списку поиска

# загрузить внешнюю программу по имени файла

require 'Package/Subpackage/Program.pm';

Если

в команде require указано полное имя пакета в виде "голого слова" (bareword), а не в виде строки или переменной, то имя загружаемого файла формируется по следующему правилу. Разделитель пакетов '::' в имени пакета заменяется на разделитель каталогов в используемой операционной системе, а к имени файла добавляется суффикс .pm. Суффикс .pm используется для файлов, содержащих Perl-модули, и подразумевается по умолчанию командами require и use. Тогда предыдущую команду можно переписать так:

# загрузить внешнюю программу по имени пакета

require Package::Subpackage::Program;

# вызвать подпрограмму из загруженного пакета

print Package::Subpackage::Program::subroutine, "\n";

Теперь рассмотрим другой способ обращения к внешним программам - подключение их на этапе компиляции, что часто дает дополнительные преимущества.

Хотя есть немало случаев, когда нужно загружать внешние программы во время выполнения программы, гораздо чаще библиотеки модулей подключаются во время компиляции. Это делается с помощью команды use. Преимущество использования use по сравнению с require заключается в том, что все возможные ошибки выявляются до выполнения программы на этапе компиляции. Кроме того, команда use выполняет импорт имен, определенных в подключаемом модуле, после чего их можно удобно употреблять без имени пакета.

use Package::Subpackage::Module; # подключить модуль

С помощью команды use также подключаются многие стандартные модули Perl. Другие примеры использования команды use встретятся по ходу этой лекции при обсуждении работы с модулями.

Команды require и use также применяются для контроля версии Perl, требуемой для компиляции и выполнения программы. Для этого параметром каждой из этих команд должно быть число, интерпретируемое как минимальный номер версии, который нужен, чтобы программа корректно выполнялась. Например:

use 5.005; # использовать версию Perl не ниже указанной

require 5.008007; # использовать Perl 5.8.7 и выше

Если не выполняется требование, заданное в use, то компиляция завершится аварийно. Невыполнение требования, указанного в require, приведет к ошибке во время выполнения программы.

Модуль - это специальным образом оформленная библиотека подпрограмм, предназначенных для многократного использования. Модули появились в Perl, начиная с версии 5, и с тех пор подавляющее большинство универсальных Perl-программ оформляются в виде модулей. В отличие от обычных библиотек, модули имеют внешний интерфейс - ограниченный набор переменных и функций, предназначенных для использования другими программами. Доступ к внешнему интерфейсу модуля в вызывающей программе организуется с помощью механизма импортирования имен, реализованному в стандартном модуле Exporter. Приведем пример оформления типичного модуля (сохраненного в файле Module.pm):

package Module; # пространство имен модуля

use 5.006001; # использовать версию Perl не ниже указанной

use strict; # включить дополнительные проверки

use warnings; # и расширенную диагностику

our $VERSION = '1.00'; # версия модуля

require Exporter; # загрузить стандартный модуль Exporter

our @ISA = qw(Exporter); # неизвестные имена искать в нем

Поделиться:
Популярные книги

Преступления США. Americrimes. Геноцид, экоцид, психоцид, как принципы доминирования

Акимов Максим Валерьевич
Документальная литература:
публицистика
4.50
рейтинг книги
Преступления США. Americrimes. Геноцид, экоцид, психоцид, как принципы доминирования

Газлайтер. Том 27

Володин Григорий Григорьевич
27. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.40
рейтинг книги
Газлайтер. Том 27

Лекарь Империи 7

Карелин Сергей Витальевич
7. Лекарь Империи
Фантастика:
городское фэнтези
аниме
боевая фантастика
попаданцы
5.00
рейтинг книги
Лекарь Империи 7

Дырка для ордена; Билет на ладью Харона; Бремя живых

Звягинцев Василий
Фантастика:
альтернативная история
фэнтези
8.12
рейтинг книги
Дырка для ордена; Билет на ладью Харона; Бремя живых

Злодейка требует тортик

Рэн-Мари Катерина
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Злодейка требует тортик

Егерь. Прилив. Книга 10

Скиба Николай
10. Зверолов
Фантастика:
рпг
фэнтези
фантастика: прочее
попаданцы
5.25
рейтинг книги
Егерь. Прилив. Книга 10

Том 12. В среде умеренности и аккуратности

Салтыков-Щедрин Михаил Евграфович
12. Собрание сочинений в двадцати томах
Проза:
русская классическая проза
6.25
рейтинг книги
Том 12. В среде умеренности и аккуратности

История США

Иванян Эдуард Александрович
Научно-образовательная:
история
6.00
рейтинг книги
История США

Мир Диорисса. Дилогия

Григорьева Наталья Сергеевна
Фантастика:
фэнтези
6.00
рейтинг книги
Мир Диорисса. Дилогия

Принц приливов

Конрой Пэт
Любовные романы:
современные любовные романы
8.45
рейтинг книги
Принц приливов

Старая школа рул

Ромов Дмитрий
1. Второгодка
Фантастика:
альтернативная история
6.00
рейтинг книги
Старая школа рул

Месть троллей

Хардебуш Кристоф
1. Тролли
Фантастика:
фэнтези
7.92
рейтинг книги
Месть троллей

Девушка для героя, или Как я свахой подрабатывала[СИ]

Звёздная Елена
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Девушка для героя, или Как я свахой подрабатывала[СИ]

Александр Иванович Шокин. Портрет на фоне эпохи

Коллектив авторов
6. Созидатели отечественной электроники
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Александр Иванович Шокин. Портрет на фоне эпохи