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

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

Жанры

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

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

Шрифт:

$referent1 = 'Референт'; # объект ссылки

$symlink = 'referent' . 1; # символическая ссылка

# доступ по символической ссылке к значению объекта

print ${$symlink}; # будет выведено: 'Референт'

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

с помощью прагмы use strict 'refs'.

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

Лекция 12. Подпрограммы

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

Цель лекции: получить знания, необходимые для разработки на Perl структурированных модульных программ, учитывая своеобразие реализации в нем механизма подпрограмм. Научиться использовать на практике особенности работы с подпрограммами. Изучить способы задания области видимости переменных.

Для моделирования в программе внешнего мира программист создает необходимые сущности в виде переменных, подобно тому как человек обозначает существительными предметы и явления. Подпрограммы позволяют программисту создавать собственные глаголы для именования серии повторяющихся действий или для замены длинной последовательности действий одним идентификатором. Определение подпрограммы напоминает определение термина в словаре, например: "сортировать - расположить элементы набора данных в определенной последовательности путем их сравнения и перестановки". Затем все, кто знает определение термина, могут пользоваться им для указания выполнить соответствующее действие, например: "сортировать список книг по возрастанию названий".

Кроме того, подпрограммы - это средство структурирования программы. Довольно часто программный комплекс разрабатывается методом "сверху вниз", когда сначала определяются крупные части программы и порядок их выполнения без уточнения деталей реализации. Затем в ходе проектирования выясняются способы взаимодействия этих частей и фиксируются их интерфейсы (входные и выходные данные). После чего каждая крупная часть программного проекта подвергается аналогичной декомпозиции на более мелкие составляющие. В результате такого процесса "пошагового уточнения" (stepwise refinement) определяются программные компоненты в виде подпрограмм, выполняющих определенные действия. После чего пишется код подпрограмм, реализующий конкретные алгоритмы. Ну и конечно, применение подпрограмм дает возможность повторного использования (code reuse) готовых и проверенных программ, которые оформляются в виде библиотек модулей проекта.

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

Подобно определению термина в словаре, при определении подпрограммы (subroutine definition) с ее именем сопоставляется последовательность действий, которую нужно выполнить. Подпрограммы определяются с помощью ключевого слова sub, за которым следует имя подпрограммы и блок, называемый телом подпрограммы, в котором содержатся исполняемые предложения подпрограммы.

Имя подпрограммы - это идентификатор, который записывается по тем же правилам, что и имя переменной. В соответствии со сложившимся стилем программирования на Perl имена подпрограмм записываются строчными буквами, а логические составляющие имени разделяются символами подчеркивания. Часто для имен подпрограмм выбирают подходящие по смыслу глаголы. Вот пример определения подпрограммы и ее вызова:

# определение подпрограммы:

sub say_hello { # имя подпрограммы

if ($language eq 'ru') { # тело подпрограммы

print 'Здравствуйте!';

} elsif ($language eq 'ja') {

print 'Konnichi-wa!';

} else {

print 'Hello!';

}

}

$language = 'ru'; # напечатать приветствие по-русски

say_hello; # вызов подпрограммы

Определение подпрограмм может располагаться в любом месте программного файла. (Можно даже перемежать определения подпрограмм выполняемыми предложениями программы, поскольку определения пропускаются при выполнении. Но разбираться в логике такой программы будет непросто!) Из соображений практического удобства, определения подпрограмм часто располагают в исходном тексте после основной программы, чтобы вначале ознакомиться с общей логикой программы. Но это дело вкуса: например, разработчики, привыкшие программировать на Pascal или C, располагают определения подпрограмм в начале исходного текста.

В Perl все подпрограммы всегда возвращают значения. Если не указано ничего иного, возвращаемым значением будет значение последнего вычисленного в подпрограмме выражения. В следующем примере функция dice возвращает список из двух случайных чисел от 1 до 6, имитируя бросок игральных костей:

sub dice { # бросаем игральные кости:

(int(rand 6)+1, int(rand 6)+1); # два случайных числа

}

Также в Perl есть встроенная функция возврата из подпрограммы return, которая завершает выполнение подпрограммы и возвращает значение указанного выражения. Так делается в пользовательской функции приветствия:

sub greeting { # приветствие в зависимости от времени суток

my $hours = (localtime)[2]; # текущие часы

if ($hours >= 4 and $hours < 12) {

return 'Доброе утро';

} elsif ($hours >= 12 and $hours < 18) {

return 'Добрый день';

} elsif ($hours >= 18 and $hours < 22) {

return 'Добрый вечер';

} else {

return 'Доброй ночи';

}

}

print greeting, '!';

Если выражение не указано, возвращается пустой список в списочном контексте и неопределенное значение undef– в контексте скалярном. В следующем примере функция проверки размера файла get_file_size возвращает неопределенное значение как сигнал об отсутствии файла.

sub get_file_size { # узнать размер файла

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

Меч

Андрижески Дж. С.
3. Мост и Меч
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Меч

Вечный. Книга IV

Рокотов Алексей
4. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
6.25
рейтинг книги
Вечный. Книга IV

Рассвет русского царства. Книга 2

Грехов Тимофей
2. Новая Русь
Фантастика:
альтернативная история
попаданцы
историческое фэнтези
5.00
рейтинг книги
Рассвет русского царства. Книга 2

Возлюбленный мой

Уорд Дж. Р.
Любовные романы:
эро литература
5.00
рейтинг книги
Возлюбленный мой

Иммунитет Вселенной (Путь Знахаря)

Утолин Константин Владимирович
Фантастика:
научная фантастика
5.00
рейтинг книги
Иммунитет Вселенной (Путь Знахаря)

Наследие Чёрного Мага

Saventos
1. Не очень добрый волшебник Зереф
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Чёрного Мага

О, Боже! Какие мужчины! Трилогия

Яблочкова Наталья
1. О, Боже! Какие мужчины!
Любовные романы:
любовно-фантастические романы
5.25
рейтинг книги
О, Боже! Какие мужчины! Трилогия

Чинди

Макдевит Джек
3. Космоархеологи
Фантастика:
космическая фантастика
6.40
рейтинг книги
Чинди

Таганский дневник. Книга 1

Золотухин Валерий Сергеевич
Документальная литература:
биографии и мемуары
6.80
рейтинг книги
Таганский дневник. Книга 1

Ключ для хранителя

Саринова Елена
1. Ключ для хранителя
Любовные романы:
любовно-фантастические романы
8.54
рейтинг книги
Ключ для хранителя

Шесть с половиной ударов в минуту

Пушкарёва Рить
Фантастика:
фэнтези
5.00
рейтинг книги
Шесть с половиной ударов в минуту

Наследие

Мессенджер Шеннон
8. Хранитель забытых городов
Фантастика:
фэнтези
5.00
рейтинг книги
Наследие

Два дня в апреле

Мини Роушин
Проза:
современная проза
5.00
рейтинг книги
Два дня в апреле

Рядовой. Назад в СССР. Книга 1

Гаусс Максим
1. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Рядовой. Назад в СССР. Книга 1