Вступительное слово | 11 |
|
Предисловие | 12 |
|
1. Введение | 19 |
Что вы должны знать? | 20 |
Как быть со сносками? | 20 |
Как быть с упражнениями? | 21 |
Что делать, если я преподаю Perl? | 21 |
|
2. Основы | 22 |
Операторы списков | 22 |
Организация ловушек ошибок с помощью eval | 27 |
Исполнение программного кода, созданного динамически | 28 |
Упражнения | 29 |
|
3. Модули | 31 |
Стандартный дистрибутив | 31 |
Использование модулей | 32 |
Функциональные интерфейсы | 33 |
Как составить список импорта | 34 |
Объектно-ориентированные интерфейсы | 35 |
Типичный объектно-ориентированный модуль Math::BigInt | 35 |
Единая архивная сеть Perl | 36 |
Установка модулей из CPAN | 37 |
Настройка списка каталогов для поиска модулей | 38 |
Упражнения | 41 |
|
4. Введение в ссылки | 43 |
Выполнение однотипных действий с разными массивами | 43 |
Ссылки на массивы | 45 |
Разыменование ссылок на массивы | 46 |
Избавляемся от фигурных скобок | 48 |
Модификация массивов | 49 |
Вложенные структуры данных | 49 |
Упрощаем доступ к вложенным структурам с помощью стрелок | 52 |
Ссылки на хеши | 53 |
Упражнения | 55 |
|
5. Ссылки и области видимости | 57 |
Несколько ссылок на данные | 57 |
А если это было имя структуры? | 59 |
Подсчёт ссылок и вложенные структуры данных | 60 |
Ошибки при подсчёте ссылок | 62 |
Создание анонимных массивов | 64 |
Создание анонимных хешей | 67 |
Автовивификация | 69 |
Автовивификация и хеши | 72 |
Упражнения | 74 |
|
6. Управление сложными структурами данных | 76 |
Использование отладчика для просмотра данных |
со сложной структурой | 76 |
Просмотр данных со сложной структурой |
с помощью модуля Data::Dumper | 81 |
YAML | 83 |
Сохранение данных со сложной структурой |
с помощью модуля Storable | 84 |
Операторы grep и map | 86 |
Обходное решение | 86 |
Выбор и модификация данных со сложной структурой | 88 |
Упражнения | 89 |
|
7. Ссылки на подпрограммы | 91 |
Ссылки на именованные подпрограммы | 91 |
Анонимные подпрограммы | 96 |
Подпрограммы обратного вызова | 98 |
Замыкания | 99 |
Подпрограмма как возвращаемое значение |
другой подпрограммы | 101 |
Использование переменных замыканий для ввода данных | 104 |
Переменные замыканий как статические |
локальные переменные | 105 |
Упражнения | 107 |
|
8. Ссылки на дескрипторы файлов | 109 |
Старый способ | 109 |
Улучшенный способ | 110 |
Способ ещё лучше | 112 |
IO::Handle | 112 |
Ссылки на дескрипторы каталогов | 117 |
Упражнения | 118 |
|
9. Практические приёмы работы со ссылками | 120 |
Краткий обзор способов сортировки | 120 |
Сортировка по индексам | 122 |
Эффективность алгоритмов сортировки | 124 |
Преобразование Шварца | 126 |
Многоуровневая сортировка на основе преобразования Шварца | 127 |
Данные с рекурсивной организацией | 127 |
Построение структур данных с рекурсивной организацией | 129 |
Отображение данных с рекурсивной организацией | 132 |
Упражнения | 133 |
|
10. Разработка больших программ | 135 |
Ликвидация повторяющихся участков программного кода | 135 |
Вставка программного кода с помощью eval | 137 |
С помощью оператора do | 137 |
С помощью директивы require | 139 |
require и @INC | 141 |
Конфликт имён | 144 |
Имена пакетов как разделители пространств имён | 146 |
Область видимости директивы package | 148 |
Пакеты и лексические переменные | 149 |
Упражнения | 149 |
|
11. Введение в объекты | 151 |
Если бы мы могли говорить на языке зверей | 151 |
Вызов метода с помощью оператора «стрелка» | 153 |
Дополнительный параметр при вызове метода | 154 |
Вызов второго метода с целью упрощения | 155 |
Несколько замечаний о массиве @ISA | 156 |
Перекрытие методов | 158 |
Поиск унаследованного метода | 160 |
SUPER способ добиться того же самого | 161 |
Зачем нужен аргумент @_ | 162 |
Что мы узнали… | 162 |
Упражнения | 162 |
|
12. Объекты и данные | 164 |
Лошадь лошади рознь | 164 |
Вызов метода экземпляра | 166 |
Доступ к данным экземпляра | 166 |
Как создать лошадь | 167 |
Наследование конструктора | 168 |
Создание метода, работающего как с экземплярами, |
так и с классами | 169 |
Добавление параметров к методам | 170 |
Более сложные экземпляры | 171 |
Лошадь другого цвета | 172 |
Что возвращать | 173 |
Не открывайте чёрный ящик | 175 |
Оптимизация методов доступа | 176 |
Операция чтения и записи в одном методе | 176 |
Ограничение доступа к методам только по имени класса |
или только для экземпляров класса | 177 |
Упражнения | 178 |
|
13. Уничтожение объектов | 179 |
Уборка мусора | 179 |
Уничтожение вложенных объектов | 181 |
Вторичная переработка | 185 |
Форма косвенного обращения к объектам | 186 |
Дополнительные переменные экземпляра в подклассах | 188 |
Переменные класса | 190 |
Слабые ссылки | 192 |
Упражнения | 195 |
|
14. Дополнительные сведения об объектах | 196 |
Методы класса UNIVERSAL | 196 |
Проверка возможностей объектов | 197 |
Метод AUTOLOAD как последняя инстанция | 199 |
Применение AUTOLOAD для реализации методов доступа | 200 |
Более простой способ создания методов доступа | 201 |
Множественное наследование | 203 |
Упражнения | 204 |
|
15. Экспортирование | 206 |
Что делает директива use | 206 |
Импорт с помощью модуля Exporter | 208 |
©EXPORT и @EXPORT_OK | 208 |
% EXPORT_TAGS | 210 |
Экспорт имён в объектно-ориентированных модулях | 211 |
Собственные подпрограммы импорта | 213 |
Упражнения | 215 |
|
16. Создание дистрибутива | 216 |
Собрать дистрибутив можно разными способами | 217 |
Программа h2xs | 218 |
Файл README | 220 |
Встроенная документация | 226 |
Управление дистрибутивом с помощью Makefile.PL | 229 |
Изменение каталога установки (PREFIX=…) | 231 |
Тривиальная команда make test | 232 |
Тривиальная команда make install | 233 |
Тривиальная команда make dist | 234 |
Дополнительные каталоги с библиотеками | 235 |
Упражнения | 236 |
|
17. Основы тестирования | 237 |
Чем больше тестов, тем лучше программный код | 237 |
Простейший сценарий с тестами | 238 |
Искусство тестирования | 239 |
Тестирующая система | 242 |
Разработка тестов с помощью Test::More | 244 |
Тестирование объектно-ориентированных особенностей | 247 |
Списки To-Do тестов | 249 |
Пропуск тестов | 249 |
Более сложные тесты (несколько тестовых сценариев) | 250 |
Упражнения | 251 |
|
18. Дополнительные сведения о тестировании | 253 |
Тестирование длинных строк | 253 |
Тестирование файлов | 254 |
Тестирование устройств STDOUT и STDERR | 256 |
Работа с ложными объектами | 258 |
Тестирование документации в формате POD | 260 |
Степень покрытия тестами | 261 |
Разработка собственных модулей Test::* | 262 |
Упражнения | 266 |
|
19. Передача модулей в CPAN | 267 |
Всемирная сеть архивов Perl | 267 |
Первый шаг | 268 |
Подготовка дистрибутива | 269 |
Передача дистрибутива на сервер | 270 |
Объявление о выпуске модуля | 271 |
Тестирование на нескольких платформах | 271 |
Подумайте о написании статьи или доклада | 272 |
Упражнения | 272 |
|
А. Ответы к упражнениям | 273 |
|
Алфавитный указатель | 302 |