Подпрограммы
Подпрограммы могут находиться
как в текущем файле (модуле), так и во внешнем. Перед тем, как вызвать
подпрограмму, её можно задекларировать в основной программе. Это делается
так:
-
sub
NAME; - декларация только имени подпрограммы
-
sub
NAME BLOCK; - декларация с определением
-
sub
BLOCK; - анонимная декларация
Вызываются подпрограммы следующим образом::
&
NAME (
LIST
) ,
где NAME - имя вызываемой подпрограммы;
LIST
- список назначенных параметров для этой подпрограммы, который
обрабатывается как массив
@_. Префиск
&
и круглые скобки можно не использовать, но тогда декларация обязательна.
Вызов подпрограмм из других модулей выглядет так:
use
модуль
qw(NAME1, NAME2, NAME3).
Использовать переменные внутри одной подпрограммы или модуля
можно двумя способами. Частный или приватный представляет собой декларирование
переменных посредством функции
my()
. Второй способ является локальным и применяется только для переменных форматов
(в циклах использовать не рекомендуется). Декларируются такие переменные
с помощью функции
local().
В языке
Perl
для укороченного описания типов параметров,
которые указываются подпрограмме, предусмотрены сокращения. Выглядет
это следующим образом - предварительно декларируется (
sub
my
_функция (символы-сокращения)), а затем, в нужном месте,
непосредственно сам вызов. К символам-сокращениям в данных описаниях
относятся:
-
\
- обозначает, что бдет применяться параметр с типом 'символ'
-
$
- описание, как скаляра
-
@
или
%
- оставшиеся параметры будут обрабатываться как список
-
;
- разделят обязательные и не обязательные параметры между собой
- * - тип описания имен (например:
handle,
writehandle и т. д.)
-
&
- анонимная подпрограмма
Приведем пример:
sub mygrep(&@) # декларация
mygrep { /good/ } $var1, $var2, $var3 # вызов
В языке
Perl
можно не только передавать подпрограмме значения
элементов массива, но и делать ссылку на него. Причем в этом случае,
подпрограмма может менять значения указанного массива. Ссылка делается
путем добавления символа "*" (звездочка) к имени переменной и действует
для всех элементов массива, кроме скалярных. Изменять скаляры можно,
например, с помощью переменной
$_[ ].
Модули (пакеты)
Модуль
- это несколько подпрограмм и переменных, находящихся
в одном файле. В одном модуле может находиться другой (по аналогии
табличного принципа в построении web-страницы). Начало модуля указывается
в коде програвммы так:
packages
имя_модуля, а концом модуля будет являться конец блока или файла.
Имя для основного модуля по умолчанию устанавливается
main
. Кроме того это имя в пределах модуля можно не указывать, а просто
ссылаться на него с помощи установки вместо
main
двух двоеточий (
::
).
Текущий пакет поддерживает хранение имен переменных
только тех, которые начинаются с буквы или "
_
". Остальные
переменные будут находиться в пакете
main
. Кроме них там же хранятся и имена
STDIN, STDOUT, STDERR, ARGV, ARGVOUT,
ENV, INC и
SIG
.
В модуле предусмотрены выполнение двух специальных подпрограмм
с именами
BEDIN
- конструктор создания объекта и
END
- деструктор (удаление объекта). Конструктор
обрабатывается компилятором сразу (до окончания полного сканирования
подпрограммы), как будет обнаружен. Деструктор будет выполнен при
окончании работы интерпритатора.
Если говорить о классах, то в языке
Perl модули могут
быть реализованы классами и вэтом случае подпрограммы модуля будут
являться методами. Массив
@ISA
использует принцип построения наследования в классах.
Форматы
Язык
Perl имеет встроенные возможности по созданию форматированного
абзаца. Сначала для этого применяется оператор
format
, который содержит
рамеры отступов, нужное положения и рамеры текстовой информации,
а затем, посредством функции
write
файл
, всё в нужном виде переходит в назначенный
файл.
Оператор
format в программах применяется в следующем виде:
format имя =
FORMLIST
(строки формата)
где имя - имя формата (при отсутствии действует значение
STDOUT
).
FORMLIST
может быть комментарием с обозначением "
#
", указателем форматирования полей со строками числовых аргументов,
либо без них. Для обозначения последнего применяются следующие
символы:
-
>>>>
- применять значение, относительно левого края
-
<<<<
- применять значение, относительно правого края
-
IIII
- применять значение, относительно центра
-
####.###
- числа с точкой
- @* - вывод значений в столбик,
где колличество символов является размером.
Каждое новое поле начинается с символа "
@" или "
^
". При применении последнего назначаются специфические значения:
-
^####
- символы не выводятся, если переменная не найдена.
-
^<<<<<
- вывод в строку максимального колличество символов и перевод
остаточного колличества в значение переменной, которая интерпритирует
их в последующих строках, при условии наличия собственных полей.
При форматировании листов используются такие переменные,
как:
-
$^
- формат заголовка
-
$~
- формат для строк
-
$%
- номер листа
-
$=
- колличество строк в листе
Отладчик
Язык Perl в своем "арсенале" имеет виртуальный отладчик,
обращаясь к которому можно полностью протестировать программу
на наличие ошибок, а также просмотреть её "изнутри". Для вызова
отладчика нужно запустить программу с ключом "
-d
". При работе с отладчиком используются следующие команды:
Имя
|
Функция команды
|
|
h |
справка о командах |
| s |
исполнение одной команды
с последующей остановкой |
| n |
завершение работы по
окончанию обработки подпрограммы |
| r |
что и предыдущая, но
в отношении текущей подпрограммы |
| c |
выполнение отрезка программы
(до следующей точки остановки) |
| c _номер |
выполнение до строки
с указанном
номером |
| T |
просмотр стека программы |
| l _номер |
вывод строки с указанным
номером
|
| l |
вывод последующего экрана
строк |
| w _строк |
вывод указанного в "
w"
экрана строк |
| l _подпрограмма |
вывод для просмотра
кода соответствующей
подпрограммы |
| l min+incr |
вывод
incr+1 строк от
строки
min |
| l min - max |
вывод строк от min до max |
| /шаблон/ |
поиск строки в коде
программы |
| ?шаблон? |
обратный поиск строки
в коде программы |
| S |
получение имен для всех
подпрограмм |
| L |
вывод отрезка строк
от места остановки до активов |
| t |
тумблер трассировки |
| b подпрограмма [условие] |
при назначенном
условии в начале указанной
подпрограмме произойдет остановка |
| b строка [условие] |
назначение точки остановки
при определенном
условии |
| d |
исключение точки остановки |
| D |
исключение всех точек
остановки |
| a _строка команда |
Назначение актива, т.е
выполнение
команды вместе
с указанной
строкой |
| A |
убрать все активы |
| < команда |
назначение
команды перед
каждой остановкой |
| > команда |
назначение
команды после
каждой остановки |
| ! номер |
обработка только одной
строки с указанным
номером |
| ! -номер |
отработка одной команды
с предыдущей строки, указанной
номером |
| команда |
выполнение обычной команды
Perl |
| ^D или q |
выход из программы |
| H-n |
показать n-ое колличество
отработанных команд |
| p выражение |
показать значение
выражения |
| V модуль [имена] |
показать значение всех,
либо указанных
имен в этом
модуле |
|
X [имена] |
аналогичен предыдыдущему,
но относительно текущего модуля |
|