WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!

Pages:     || 2 | 3 | 4 | 5 |   ...   | 7 |
-- [ Страница 1 ] --

Освой самостоятельно за 24 часа Cl i nt o n Pi e r c e T e a c h Y o u r s e l f P e r l 24 Hours on Computer 201 West 103rd St., Indianapolis, I Клинтон Пирс самостоятельно часа Издательский

дом Москва • Киев П19 УДК Издательский дом По общим вопросам обращайтесь в Издательский по адресу: iamspublishing.com Пирс, Клинтон.

П19 Освой самостоятельно за 24 часа. : Пер. с англ. : Уч. — М. : Издатель ский дом "Вильяме", — 384 с.: ил. — Парал. тит. англ.

5-8459-0097-2 (рус.) Эта книга научит вас основам языка программирования Perl. Вы узнаете достаточно для чтобы самому сделать что-нибудь полезное. Автор ведет повествование в легком и опуская в то же время редко встречающиеся нюансы программирования. Каждая новая ме тодика продемонстрирована на множестве работающих примеров — от создания простейшей про граммы на Perl и до разработки сложных Книга будет интересна широкому кругу читателей.

Все названия программных продуктов являются зарегистрированными торговыми марками соответст вующих фирм.

Никакая часть настоящего издания ни в каких целях не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами, будь то электронные или механические, включая фотокопи рование и запись на магнитный носитель, если на это нет письменного разрешения издательства Sams Publishing.

Authorized translation the English language edition published by Sams Publishing Copyright All rights reserved. No part of this book may be reproduced or transmitted in any or by any electronic or mechanical, including photocopying, recording or by any information storage retrieval without permission the Publisher.

Russian language edition published by Williams Publishing House according to the with Enterprises International, © 5-8459-0097-2 © Издательский ISBN 0-672-31773-7 (англ.) © Sams Publishing, Оглавление Введение ЧАСТЬ I. ОСНОВЫ PERL 1 -й час. Начало работы с 2-й час. Строительные блоки Perl: числа и строки 3-й час. Управление процессом выполнения программы 4-й час. Укладка строительных блоков: списки и массивы 5-й час. Работа с файлами 6-й час. Поиск по шаблону 7-й час. Хэши 8-й час. Функции ЧАСТЬ II. УГЛУБЛЯЕМСЯ В PERL 9-й час. Дополнительные функции и операторы 10-й час. и каталоги час. Взаимодействие с операционной системой 12-й час. Работа с командной строкой час. Структуры и ссылки час. Использование модулей час. Обработка данных в Perl час. Сообщество Perl ЧАСТЬ НА PERL час. Введение в CGI час. Основы обработки форм 19-й час. Сложные формы 20-й час. Работа с HTML-кодом и 21-й час. Файлы cookie 22-й час. Отправка электронной почты из 23-й час. Push-технология и счетчики посещений Web-страниц 24-й час. Создание интерактивного Web-сервера Приложение. Инсталляция модулей в Предметный указатель Оглавление Содержание Введение ЧАСТЬ I. ОСНОВЫ PERL 1-й час. Начало работы с Perl Установка Perl А если Perl уже установлен? Установка Per! в Windows 95/98/NT Установка в UNIX Установка Perl на компьютерах Macintosh Документация Другие способы доступа к документации А если документация отсутствует? Ваша первая программа Наберите вашу первую программу Запуск программы Заработало! Что же произошло? Проследим за Perl Это вы должны знать Резюме. Вопросы и ответы Семинар Контрольные вопросы Ответы Упражнения 2-й час. Строительные блоки Perl: числа и строки Литералы Числовые литералы Строковые литералы Скалярные переменные Специальная переменная S_ Выражения и операторы Основные операторы Числовые операторы Строковые операторы Другие операторы Унарные операторы Инкремент и декремент Угловой оператор. Другие операторы присваивания Несколько слов о строках и числах Упражнение: вычисление сложных процентов Резюме Вопросы и ответы 6 Содержание Семинар Контрольные вопросы Ответы Упражнения 3-й час. Управление процессом выполнения программы БЛОКИ Оператор if Другие операторы отношения. Что Истина в Perl Логические операторы ЦИКЛЫ Организация циклов с оператором while Организация циклов с оператором Другие средства управления программой Альтернативная запись оператора if Операторы управления циклами Метки Выход из Упражнение по нахождению простых чисел Резюме Вопросы и ответы Семинар Контрольные вопросы Ответы Упражнения 4-й час. Укладка строительных блоков: списки и массивы Помещение скаляров в список или массив Массивы Доступ к элементам массива Определение размера массива Подробнее о контексте Возвращаясь к старой Работа с массивами Поэлементная работа с массивом Взаимные преобразования массивов и скаляров Упорядочивание элементов массива Упражнение: небольшая игра Резюме Вопросы и ответы Семинар Контрольные вопросы Ответы Упражнения 5-й час. Работа с файлами Открытие файлов Пути Береженого Бог Умирать, так с Чтение данных из файла Запись в файл - Свободные дескрипторы, тестирование файлов и двоичные данные Содержание Свободные дескрипторы Работа с бинарными файлами Операторы тестирования файлов Резюме Вопросы и ответы Семинар • Контрольные вопросы Ответы Упражнения 6-й Поиск по шаблону Простые шаблоны Правила игры Метасимволы метасимвол Непечатные символы Квантификаторы Классы символов Группировка и альтернация Анкеры Подстановка Упражнение: очистка входных данных Дополнительная информация о регулярных выражениях Работа с другими переменными Модификаторы и многократный поиск Обратные ссылки Новая функция: grep Резюме Вопросы и ответы Семинар Контрольные вопросы Ответы Упражнения 7-й час. Хэши Наполнение хэша Получение данных из хэша и Дополнительная информация о хэшах Проверка ключей хэша Удаление ключей из хэша Практическое применение хэшей Определение частоты появления слов Нахождение уникальных элементов массива ] Вычисление пересечения и разности массивов Сортировка хэшей Упражнение: создание в Perl простой базы данных пользователей Резюме Вопросы и ответы Семинар Контрольные вопросы. Ответы Упражнения Содержание 8-й час. Создание и вызов подпрограмм Возврат значений из подпрограмм Аргументы Передача массивов и Область видимости Использование оператора Упражнение: подсчет статистики Подробнее о функциях Объявление переменных с помощью оператора local Как сделать Perl строже Рекурсия Резюме Вопросы и ответы Семинар вопросы Ответы Упражнения ЧАСТЬ II. УГЛУБЛЯЕМСЯ В PERL 9-й час. Дополнительные функции и операторы Поиск скаляров index Поиск в обратном направлении с помощью функции rindex Выделение части строки с помощью функции Транслитерация, а не подстановка Улучшение качества печати Упражнение: создание отчета Списки и стеки Слияние и разделение массивов Резюме Вопросы и ответы Семинар Контрольные вопросы Ответы Упражнения 10-й час. файлы и каталоги Получение листинга каталога Отбор файлов заданного типа Упражнение: реализация утилиты UNIX Каталоги Перемещение по каталогам Создание и удаление каталогов Удаление файлов Переименование и перемещение Небольшой экскурс в Немного о правах доступа к файлам Получение информации о файле Упражнение: переименование группы файлов Резюме Вопросы и ответы Содержание Семинар Контрольные вопросы Ответы ] Упражнения Взаимодействие с операционной системой system() Использование командной оболочки Перенаправление выходного потока Как избежать обращения к командной оболочке Конвейерная обработка Обшие сведения о переносимости программ Как быть с отличиями? 1S Резюме Вопросы и ответы Семинар Контрольные вопросы Ответы Упражнения час. Работа с командной строкой Perl Отладчик Perl Запуск отладчика Основные команды отладчика Точки останова Другие команды отладчика Упражнение: поиск ошибки Дополнительные возможности интерпретатора Однострочные программы Дополнительные ключи командной строки оператор и однострочные программы Резюме Вопросы и ответы Семинар Контрольные вопросы 13-й час. Структуры и ссылки Основные сведения ССЫЛКИ на массивы ССЫЛКИ на хэши ССЫЛКИ на аргументы Создание структур Примеры структур данных Список списков, или двумерный массив Примеры других структур Отладка использующих ссылки Упражнение: еще одна Резюме Вопросы и ответы Семинар Контрольные вопросы Ответы Упражнения 10 Содержание час. Использование модулей Немного введения Чтение Какие могут возникнуть проблемы?

Краткий обзор файлов и каталогов Копирование файлов Есть здесь кто-нибудь? Еще раз. пожалуйста, но по-английски! Дополнительные средства диагностики Полный список стандартных модулей Что дальше Резюме Вопросы и ответы Семинар Контрольные вопросы Ответы Упражнения Обработка данных в Файлы DBM Некоторые важные замечания Обработка больших DBM-файлов Пример: программная реализация записной книжки Использование текстовых файлов в качестве базы данных Вставка и удаление записей из текстового файла Произвольный доступ к файлу Открытие файлов для чтения и записи Перемещение по файлу при выполнении операции чтения или записи Блокировка данных Блокировка в UNIX и Windows NT Чтение и запись файлов с блокировкой Блокировка в Windows 9x Блокировка в системах UNIX и Windows NT Резюме Вопросы и ответы Семинар Контрольные вопросы Ответы Упражнения 16-й Сообщество Perl Так что же такое это сообщество Perl? Краткая история Открытый код Разработка Perl Сеть полного архива (CPAN) Что это такое? Почему люди вносят свой вклад в работу сообщества Perl? Куда двигаться дальше Ваш шаг Ваш самый полезный инструмент Отладка программы Во-первых, помогите себе сами Учитесь на ошибках других Содержание Когда все остальное не удалось, Другие ресурсы Резюме Вопросы и ответы Семинар Контрольные вопросы Ответы ЧАСТЬ НА PERL час. Введение в CGI Просмотр содержимого Web Загрузка Web-страницы CG1 и динамические Web-страницы Не пропустите этот раздел Контрольный список Первая Установка на сервер Выполнение CGI-программы Что делать, если не работает А может, виновата сама программа? Проблемы сервера Устранение ошибок Internal Server Error или 500 Error Резюме Вопросы и ответы Семинар Контрольные вопросы Ответы Упражнения 18-й Основы обработки форм Как работают формы обзор форм HTML Что происходит после щелчка на кнопке Submit? Передача информации Методы GET и POST Основные сведения по вопросам безопасности в Web Открытый канал Проверка данных на безопасность Невозможные события Отказ от обслуживания Гостевая книга Резюме Вопросы и ответы Семинар Контрольные вопросы Ответы Упражнения час. Сложные формы Web-сервер "лишен памяти" Скрытые поля Электронный магазин Многостраничная форма для сбора информации 12 Содержание Резюме Вопросы и ответы Семинар Контрольные вопросы Упражнения • 20-й час. Работа с HTML-кодом и CGI-программами Протокол HTTP Пример: получение страницы вручную Пример: получение нетекстовой информации Подробнее о вызове CGI-программ Передача параметров Использование специальных символов Включения на стороне Web-сервера Пример: работа с дескрипторами SSI Выглянем из окна Перенаправление Резюме Вопросы и ответы Семинар Контрольные вопросы Ответы Упражнения 21-й час. Файлы cookie Что такое файлы cookie Создание пакетов cookie Пример: использование файлов cookie Еше один пример: просмотр файлов cookie Более сложные методы работы с файлами cookie Сохранение cookie А теперь поговорим немного о грустном Отправка файлов cookie другим серверам персональных пакетов cookie пакетов cookie Проблемы с файлами cookie Недолговечность файлов cookie Файлы cookie поддерживаются не всегда Некоторые пользователи не любят cookie Резюме Вопросы и ответы Семинар Контрольные вопросы Ответы Упражнения 22-й час. Отправка электронной почты из CGI-программ Основы работы электронной почты Internet Отправка почтового сообщения Немного о правилах хорошего тона Программные средства организации почтовой службы Отправка почты в системах Отправка почты не из системы Отправка почты из Web-страницы Содержание Контроль адресов электронной почты 34!

Резюме Вопросы и ответы Семинар Контрольные вопросы Ответы • Упражнения 23-й час. Push-технология и счетчики посещений Web-страниц Что такое push-технология Организация работы сервера в режиме выталкивания страниц пример: часов Еще один пример: анимация графического изображения Сравнение с методом вытаскивания страниц клиентом Счетчики посещений А теперь, собственно, перейдем к счетчику посещений Графический счетчик посещений Резюме Вопросы и ответы Семинар Контрольные вопросы Ответы Упражнения 24-й час. Создание интерактивного Web-сервера Заимствование информации Важный момент: не играйте с огнем Пример: "вытягивание" заголовков Каковы результаты опроса? Часть I: постановка вопросов Часть II: анализ результатов Резюме Вопросы и ответы Семинар Контрольные вопросы Ответы Упражнения Приложение. Инсталляция модулей в Perl Выбор нужного модуля Инсталляция модулей в системе... 95/98/NT...UNIX, с помощью CPAN...UNIX, трудным способом Инсталляция модулей на компьютере Macintosh Что делать, если вам не разрешается устанавливать модули Использование модулей, установленных в необычных местах Предметный указатель 14 Содержание Об авторе Клинтон — специалист по разработке программного обеспечения, "вольный" программист и преподаватель. Уже пять лет он отвечает на вопросы Perl, задавае мые в группах новостей пишет программы курсов Perl и обучает ему своих сотрудников, а также всех тех, кто хочет узнать об этом побольше. В те редкие часы, когда ему не приходится восстанавливать работоспособность системы UNIX, разраба тывать для компании Motor, обучать пользователей работе с операционной системой UNIX в компании Decision Consultants или просто ради удо вольствия сидя дома писать программы, Клинтон мечтает, чтобы его тайно похитили лесные нимфы и унесли подальше от цивилизации. Вы можете посетить его Web сервер по адресу http://www.geeksalad.org.

Посвящение и Кельвину за то, что они "не этим летом и поддержали во время этой авантюры.

Без вашей поддержки я совсем утратил бы рассудок.

Благодарности Чтобы видеть дальше, нужно стоять на плечах Гиганта.

— Исаак Ньютон Поэтому в начале книги мы должны выразить признательность одному из Гиган тов, сотворившему для нас Perl. Огромное спасибо тебе Что же касается меня, то я не только стоял на плечах этого Гиганта, но и пользо вался кладезем мудрости других людей. Чтобы написать хорошую книгу, содержащую минимум ошибок, я попросил совершенно незнакомых мне людей оценить мою ру копись и исправить ее, если в этом возникнет необходимость. Надо признаться, что я провел весьма поучительный эксперимент. В особенности мне хочется отметить тех, кто больше всего мне досаждал, выискивая в рукописи ошибки и предлагая готовые решения. Они заслуживают всяческой похвалы. Это — Абигайль, Грег Бейкен (Greg Bacon), Син Барк (Sean Bukre), Кен Фокс (Ken Fox), Кевин Мельтцер (Kevin Meltzer), Том Феникс Phoenix), Майкл Шверн (Michael Schwern), Том Гриделанд (Grydeland), Мэт Бьелански (Matt Bielanski), Марк Джейсон-Доминус (Mark Jason Джефф Пейниан (Jeff Pinyan), Гари Росс (Gary Ross), Эндрю (Andrew Chen) и Джон Белл (John Bell).

Мне также хочется поблагодарить участников канала за то, что они нашли время выслушать меня и высказали свое честное, а иногда и нелицеприятное мнение.

Речь о Лэрри (Larry Wall) языка Per!. — Прим. ред.

В некотором смысле ответственность за книгу несут Билл Крауфорд (Bill Crawford) и Донна Хинкл (Donna из-за которых я вынужден был возиться со всеми этими упражнениями. Полагаю, я должен поблагодарить и их.

И, конечно же, я должен поблагодарить сотрудников издательства тех, кто терпеливо относился к начинающему автору и кто мужественно вынее все мои муки Без людей, типа Ренди Роджера Roger), Скотта (Scott Meyers), Чака Хатчинсона (Chuck Hutchinson) и многих других, кого я здесь не упомянул, мне бы никогда не удалось завершить начатое дело.

От издательства Вы, читатель этой книги, и есть главный ее критик и комментатор. Мы ценим ва ше мнение и хотим знать, что было сделано нами правильно, что можно было сделать лучше и что вы хотели бы увидеть изданным нами. Нам интересно услышать и любые другие замечания, которые вам хотелось бы высказать в наш адрес.

Мы ждем ваших комментариев и надеемся на них. Вы можете прислать электрон ное письмо или просто посетить наш Web-сервер, оставив свои замечания, — одним словом, любым удобным для вас способом дайте нам знать, нравится или нет вам эта книга, а также выскажите свое мнение о том, как сделать наши книги более подходя щими для вас.

Посылая письмо или сообщение, не забудьте указать название книги и ее авторов, а также ваш e-mail. Мы внимательно ознакомимся с вашим мнением и обязательно учтем его при отборе и подготовке к изданию последующих книг. Наши координаты:

E-mail: info@williamspublishing.com WWW: williamspublishing.com В этой, как и в большинстве других книг по компьютерной тематике на шего издательства, есть листинги программ. Чтобы получить их, зарегист рируйтесь на нашем Web-сервере. Они будут вам присланы по электрон Введение Любая достаточно развитая технология практически неотличима от магии.

— Артур С. Кларк Так вот, зарубите себе на носу — в программировании нет ничего магического и сверхъестественного.

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

Что же может предложить вам эта книга, если вы уже выбрали цель и имеете все необходимое для изучения Perl?

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

А почему, собственно, нужно изучать Да потому, что этот язык используется практически в любой компании, которая хоть как-то связана с программированием.

Perl нашел применение в финансовой области, производстве, генетике, военном деле, а также во всех остальных отраслях деятельности человека. И, конечно, где были бы Internet и World Wide Web без Perl? Судя по всему, Perl еще долго не сойдет с арены, поэтому то, что вы узнаете сейчас, сможет оказаться вам полезным в будущем.

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

Как работать с этой книгой Книга разбита на 24 темы, для изучения каждой из которых требуется приблизи тельно один час. Однако мы не хотим вас ограничивать этими рамками. Вы можете постигать урок за уроком хоть сутки напролет (если забудете про сон и аппетит) или проделывать это в собственном темпе, скажем за 10 минут, В конце каждого часа вам будут предложены определенные задания. В уроках со держатся объяснения элементов и особенностей языка. В каждом уроке предусмотре на возможность удобного обучения путем выполнения предложенных упражнений.

принятые в этой книге В книге Освой самостоятельно Perl за 24 часа приняты следующие соглашения.

• Каждый час предваряется его кратким обзором.

• Пошаговые инструкции выделены соответствующей пиктограммой.

Введение • В конце каждого часа приведено резюме и список часто задаваемых вопро сов и ответов на них. Будем надеяться, что среди них вы найдете вопросы, интересующие вас.

В книге также встречаются перечисленные ниже пиктограммы.

j Заметки с комментариями и отступлениями от текущей темы Рекомендации и советы помогут выполнить поставленное задание Описываются типичные проблемы при работе с Perl и способы их устранения.

Новые термины выделяются курсивом, чтобы вы обратили на них внимание.

18 Введение Часть I Основы Perl Темы занятий 1 Начало работы с Perl 2 Строительные блоки Perl: числа и строки 3 Управление процессом выполнения программы 4 Укладка строительных блоков: списки и массивы 5 Работа с файлами 6 Поиск по шаблону 7 Хэши 8 Функции 1-й час Начало работы Perl Perl — язык программирования общего назначения. Он может заменить любой язык программирования и применяться в любой области деятельности, которую толь ко можно представить. Он используется для анализа рынка ценных бумаг, в произ водстве, конструировании, для поддержки пользователей, для контроля качества, тес тирования программ на отсутствие проблемы 2000, системного программирования, проводки ведомостей, инвентаризации и, конечно же, в Web.

Perl получил такое широкое распространение потому, что он является интегрирую щим языком (glue который позволяет совместно использовать разнородные программные технологии. Например, на Perl не написан текстовый процессор лишь потому, что уже существует достаточное количество приличных текстовых процессо ров и без Perl, а не потому, что это невозможно. На Perl вполне возможно написать приложение баз данных или электронных таблиц, операционную систему, функциональный Web-сервер. Но весь вопрос в том, зачем это делать?

Сила Perl — в объединении вышеперечисленных элементов. Он может взять вашу базу данных, преобразовать ее для обработки в электронных таблицах и даже моди фицировать необходимые данные. Perl способен преобразовать документы текстового процессора в формат для их дальнейшего представления в Web.

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

Для начала отметим несколько важных моментов. Язык программирования назы вается Perl. Название программы (так называемого интерпретатора), которая запускает ваши программы, perl. Это различие не имеет сколько-нибудь важного значения до момента запуска ваших программ из командной строки. В этом случае вам следует воспользоваться командой perl. Кое-где, но только не в нашей книге, вы сможете встретить слово Perl, написанное как PERL. Название Perl на самом деле является 20 Часть I. Основы Perl от Practical Extraction and Report Language, что в переводе на русский язык означает язык извлечения данных и подготовки отчетов. В настоящее время уже не принято писать PERL, это слишком официально. Для друзей он просто Perl.

Многие из элементов Perl заимствованы из других языков программирования.

Эти заимствования привели к хождению следующей расшифровки названия Perl:

Pathologically Eclectic Rubbish Lister (патологически эклектичные мусорные грабли) Основные темы этого занятия.

• Установка Perl.

• Получение доступа к встроенной документации.

• Создание первого сценария.

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

А если Perl уже установлен?

Перед тем как перейти к решительным действиям по установке, следует проверить, не установлен ли уже Perl на вашем компьютере. Учтите, что интерпретатор Perl вхо дит в стандартную поставку некоторых версий UNIX. В Windows NT программа Perl является частью Windows NT Resource Kit. Чтобы выяснить, имеется ли в вашей сис теме правильно установленная версия интерпретатора Perl, придется обратиться к ко мандной строке.

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

Иногда вместо символа $ можно увидеть символ % или что, по сути, одно и то же. После регистрации в системе оболочка выводит приглашение командной строки или приглашение оболочки. На первых нескольких занятиях вы будете взаимодейство вать с Perl посредством командной строки.

Чтобы проверить, правильно ли установлен Perl в вашей системе, наберите сле дующую команду (символ $ набирать не надо):

$ perl -v В ответ на эту команду система может выдать сообщение об ошибке {типа command not found) или же вывести номер версии интерпретатора В последнем случае счи тайте, что вам повезло — Perl у вас уже установлен и, скорее всего, переустанавливать уже не потребуется.

1-й Начало работы с Perl Для успешной работы с Perl необходимо, чтобы номер версии его интерпретато ра был не ниже 5 — 5.004, 5.005, 5.6 и т.д. Если у вас инсталлирован Perl версии 4.x, вам придется его переустановить. В старой версии Perl было много ошибок и к тому же она больше не поддерживается. Кроме того, некоторые примеры, при веденные в этой книге, просто не будут работать. В момент подготовки русского издания настоящей книги текущей версией Perl была 5.6.

Если на вашем компьютере установлена система Windows, выяснить, правильно ли установлен у вас Perl, можно следующим образом. Запустите в окне сеанс MS-DOS, как показано на рис. 1.1. В командной строке наберите (приглашение С:\> набирать уже не нужно):

C:\>perl -v ;

MS-DOS 1.1. Вы можете проверить номер версии Perl из командной строки MS-DOS Если в ответ на эту команду будет выведен номер версии интерпретатора не ниже 5, то волноваться не о чем. Если же DOS выведет сообщение об ошибке Bad command or file name (Имя команды или файла указано неправильно), Perl нужно будет установить или переустановить (если используется версия ниже 5).

Проверить, установлен ли Perl на компьютере Macintosh, можно с помощью ко манды File Find При этом в качестве критерия поиска необходимо ввести строку как показано на рис. 1.2. Если приложение найдено, запустите его и выберите в меню Apple команду About MacPerl. Если у вас установлена версия не ниже 5.2.0 (Patchlevel 5.004), то все в порядке, в противном случае — придется установить новую версию MacPerl.

More 1.2. Поиск Perl на Macintosh Часть I. Основы Perl Установка в Windows 95/98/NT Как часто бывает в жизни, для инсталляции Perl в Windows существует два спосо ба — простой и сложный. Если вы знакомы с компилятором С и сопутствующими ему средствами разработки, такими как make-файлы, оболочки, — можете сами ском пилировать Perl из имеющихся исходных файлов. Они свободно распространяются, и вы можете их просмотреть и даже модифицировать на свой вкус. Если вы заинтересо вались этим вопросом, обратитесь к материалу 16-го занятия, "Сообщество за необходимой информацией. Впрочем, стоит сразу отметить, что ручная инсталляция в Windows не под силу рядовому пользователю.

Второй способ установки действительно не вызывает никаких сложностей. Компа ния ActiveState Tool распространяет Perl в виде приложения Windows, которое уста навливается подобно остальным приложениям Windows. На рис. 1.3 показано окно программы установки. Данный интерпретатор распространяется на условиях об щей лицензии сообщества ActiveState. Ознакомиться с лицензией можно по адресу ActivePerl Build Setup Wel come to the ActivePerl Build 613 Setup Wizard The Setup Wizard will install ActivePerl Build 613 on your computer, Click Next to continue or Cancel to exit ttie Setup Wizard.

5.6.0 Build: Built: 03/24/ Инсталляция ActiveState Perl в Windows На прилагаемом к книге компакт-диске находится копия ActiveState Вы мо жете установить с этого компакт-диска или загрузить последнюю версию про граммы с Web-сервера ActiveState.

Установка Perl в UNIX Для установки Perl в UNIX у вас должны быть две вещи. Прежде всего, полный набор исходных файлов. Последнюю версию исходных файлов всегда можно загрузить из раздела Download Web-сервера http://www.perl.com. Там вы найдете сразу несколько 1-й Начало работы с Perl версий, но одна из них обязательно будет помечена как "Stable" или "Production".

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

Если в вашей UNIX имеется система для установки предварительно скомпилиро ванных пакетов, вы можете установить бинарные коды пакета без его компи ляции. Кроме того, интерпретатор обычно входит в поставку Linux, Solaris, AIX и многих других версий UNIX. Для получения информации о подобных паке тах обратитесь к документации.

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

$ gunzip $ tar xf Для выполнения этих команд потребуется какое-то время. Если у вас нет про граммы разархивации gunzip, можете загрузить ее с сервера http://www.gnu.org. Про граммный пакет называется gzip. По окончании разархивации наберите в командной строке следующую команду:

$ sh Configure При этом будет запущена программа Configure, которая задаст вам много вопросов.

Если вы не знаете ответов на большинство из них — ничего страшного, просто на жмите клавишу . Вам вполне подойдут параметры, принятые по умолчанию.

Как правило, в большинстве UNIX-систем установка не вызывает каких-либо проблем. После того как программа Configure завершит свою работу, введите команду $ make Она будет выполняться довольно долго — вы наверняка успеете выпить чашечку кофе. Если у вас маломощный компьютер, можете даже сделать перерыв на обед. По сле того как команда завершит свое выполнение, введите две команды:

$ make test t make install Первая команда позволяет удостовериться, что компиляция Perl прошла но и он готов к установке. Чтобы запустить вторую команду, вам придется зарегист рироваться в системе как root, для которого приглашение обычно имеет вил #. Вторая выполнит установку Perl в системные каталоги.

Если команда make install корректно выполнила свою работу, вы можете оконча тельно убедиться в том, что установка Perl прошла успешно, повторно набрав в ко мандной строке команду $ perl -v Если команда сработает — примите поздравления!

На прилагаемом компакт-диске содержится набор исходных файлов для установ ки Perl в UNIX. Вы можете воспользоваться ими или загрузить последнюю версию Perl с сервера http://www.perl.com.

24 Часть I. Основы Perl Установка Perl на компьютерах Macintosh Свежую версию Perl для Macintosh можно загрузить с Web-сервера http://www.perl.com. Дистрибутивные файлы находятся в каталоге http://www.perl.cora/ Загрузите файл appl.bin из этого каталога, разархивируйте его програм мой Expander, а затем запустите программу установки.

После этого вы должны активизировать программу для чтения документации — Shuck, которая входит в комплект поставки MacPerl. Пользователи MacOS могут сделать это с помощью Internet Control Panel, выбрав команду Mapping и ассоциировав расширение с приложением Shuck. Это позволит полу чить удобный доступ к документации. Кроме того, полезно ассоциировать расшире ния и обычно назначаемые программой на с прило жением MacPerl. Установите для них тип файла TEXT.

Пользователи MacOS 7 для выполнения описанных выше действий должны вос пользоваться утилитой InternetConfig. В выберите команду Helpers и свяжите расширение с приложением справки Shuck, а также свяжите все расши рения Perl с приложением MacPerl.

На прилагаемом компакт-диске находится копия дистрибутивного пакета MacPerl.

Установите MacPerl с или загрузите последнюю версию с узла Документация А теперь обратите внимание: в комплект поставки Perl входит полная версия теку щей документации по языку и интерпретатору Perl.

Да, да! Вы не ошиблись. Устанавливается именно полная версия документации.

Причем бесплатно! В поставку Perl версии 5.6 входит более страниц документа ции! Документация содержит справочный материал, учебники, список часто задавае мых вопросов и ответов на них (так называемый историю развития и даже примечания, касающиеся внутреннего устройства Perl.

Получить доступ к документации можно несколькими способами. В Windows и UNIX вместе с Perl инсталлируется утилита Ее можно использовать как инст румент поиска нужного раздела документации и получения форматированного выво да. Для запуска perldoc необходимо перейти в окно командной строки. В следующем примере мы покажем действие утилиты в системе UNIX, но в DOS все происходит точно так же.

$ perldoc perl User Contributed Perl Documentation NAME perl - Practical Extraction and Report Language SYNOPSIS perl [ ] [ ] [ -V[:configvarl ] [ -cw ] [ ] [ ] { ] [ ] [ -l[octal] J [ ] [ ] [ -m[-]module ] -M[-]'module...' ] [ -P ] [ -S ] [ -x[dir] ) 1-й Начало работы с Perl [ -i[extension] [ -e ] [ — ] ] [ argument ]...

For ease of access, the Perl manual has been split up into a number of sections:

Разделы руководства состоят из отдельных частей, которым присвоены имена, на пример: perlfunc (функции Perl), perlop (операторы или perlfaq (список часто задаваемых вопросов Perl). Для доступа к странице руководства perlfunc введите команду perldoc perlfunc. Названия всех разделов руководства перечислены на стра нице руководства perldoc perl.

Чтобы найти в руководстве функцию по имени, нужно запустить утилиту perldoc с ключом -tf. В следующем примере показано, как найти в руководстве описание функции print:

$ perldoc -tf print В FAQ собраны часто задаваемые вопросы, касающиеся Perl. Люди, изучающие Perl, задают одни и те же вопросы. Поэтому, чтобы сохранить время и избавить их от множества проблем, все эти вопросы собраны в файлы FAQ. Чтобы найти нужную тему в FAQ, воспользуйтесь ключом -q, после него укажите слово, которое может на ходиться в заголовке FAQ. К примеру, если вы хотите узнать о поддержке Perl, введи те следующую команду:

$ perldoc -q support В результате выполнения этой команды отобразится страница FAQ Who supports Perl? Who develops it? Why is it free?

Другие способы доступа к документации Во время установки Perl в вам предоставляется возможность уста новить документацию в традиционном man-формате. При этом стандартная докумен тация будет конвертирована в формат man и помещена в соответствующий ка талог. В результате для доступа к документации Perl можно будет использовать и программу perldoc, и программу man, как это обычно принято в $ man perl При установке в Windows пакета ActiveState страницы справочного руково дства конвертируются в формат HTML, в результате их можно просмотреть в любом Web-броузере, который поддерживает фреймы. При стандартной установке файлы до кументации находятся в каталоге Если вы установили Perl в другой ката лог, ищите файлы документации в подкаталоге html.

В пакет MacPerl входит утилита Shuck, которая находится в папке MacPerl. Исполь зуйте ее для поиска и чтения разделов документации, как показано на рис. 1.4.

А если документация отсутствует?

Существуют лишь две причины, по которым вы не сможете найти документацию.

нужно знать, где искать. Утилита perldoc может быть расположена в ката логе, отсутствующем в списке путей оболочки. В этом случае найдите программу perldoc и добавьте путь к ее каталогу в переменную окружения оболочки PATH. Во вторых, документация могла быть нечаянно или по злому умыслу удалена. Любая ус тановка Perl обязательно содержит документацию, более того, Perl никогда не инстал 26 Часть I. Основы Perl без документации. Ее отсутствие свидетельствует о том, что пакет Perl или с самого начала неправильно установлен, или впоследствии был поврежден. В этом случае, вероятно, вам (или системному администратору) придется переустановить Perl.

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

Lookup...

ana...

MacPerl Table of contents Macintosh specific MacPerl book information Macintosh Toolbox Modules Data structures General Questions Perl Obtaining and Learning about Perl Programming Tools Operators and precedence Data Manipulation Regular expressions Files Formats Predefined General Perl Language anted Topics System Troubleshooting Networking MacPerl Homepage The Pages 1.4. Утилита Shuck используется для просмотра доку ментации MacPerl Если еше что-либо произошло и вы не можете получить доступ к локальной копии документации, вам придется снова обратиться к Web-серверу. На главной странице http://www.perl.com есть ссылка на страницу документации. Конечно, лучше всегда иметь под рукой документацию, относящуюся к вашей конкретной версии Perl, но в крайнем случае подойдет и эта.

Ваша первая программа Чтобы написать программу на языке Perl, необходимо иметь текстовый редактор, который позволяет набрать неформатированный текст и сохранить его в файле. В ка честве примера простых текстовых редакторов можно привести программу Notepad (Блокнот) в Microsoft Windows и EDIT.EXE в DOS. В UNIX имеются текстовые редакто ры vi, и pico. По крайней мере, один из них должен быть на вашем компьюте ре. На приложение MacPerl содержит встроенный текстовый редактор, поэтому для создания новой программы достаточно выбрать команду Вам не следует для набора программ на Perl пользоваться текстовым процессором.

Текстовые процессоры (такие как Microsoft Word, WordPerfect и др.) сохра няют документы вместе с информацией об их форматировании, даже если вы не ис пользуете специальных атрибутов форматирования. Интерпретатор Perl не понимает эти коды и поэтому программы, набранные в текстовом процессоре, не будут рабо тать. Если все же вы решите воспользоваться текстовым процессором, не забудьте со хранить программы в виде обычного текстового файла.

1-й Начало работы с Perl Наберите вашу первую программу Откройте текстовый редактор и наберите следующую программу:

print "Hello, Строка с должна быть первой строкой файла.

После того как вы наберете эту программу в текстовом редакторе, сохраните ее в файле под названием hello. Расширение не обязательно, но если хотите, можете его указать. Некоторые приложения Windows и Macintosh используют расширения для определения типа файлов. Если по какой-то причине вы решили дать расширение, то лучше воспользуйтесь стандартными — или Для определенности назовите набранный файл hello.pl.

Запуск программы Для запуска программы необходимо перейти в режим командной строки. В UNIX зарегистрируйтесь в системе и откройте окно терминала. В Microsoft Windows открой те сеанс MS-DOS. Перейдите в каталог, где находится программа hello, используя команду оболочки cd.

Наберите в командной строке следующее. показана командная строка DOS, приглашение командной строки UNIX несколько отличается.) perl hello Должно появиться сообщение:

flello, World!

Если у вас получилось, примите наши поздравления! Запомните способ запуска этой программы, потому что подобным образом мы будем запускать программы на протяжении всей книги. (Существуют и другие способы, мы вам расскажем и о них.) Если что-то не получилось, проверьте следующее.

• Если сообщение об ошибке Bad command or file name или perl:

command not found, посмотрите, в каком каталоге находится программа perl, и добавьте путь к ней в переменную оболочки PATH.

• Сообщение об ошибке Can't perl script hello: A file or directory does not exist говорит о том, что либо файл hello находится в другом каталоге, либо вы сохранили его под другим именем.

• Ошибка syntax error означает, что интерпретатор нормально запустился, но программа не может определить, что же находится в файле hello. Напри мер, вы могли ошибиться при наборе, или тестовый процессор добавил в со храненный файл коды форматирования, Для просмотра содержимого файла в UNIX воспользуйтесь командой cat, а в DOS — type. Тщательно проверьте со держимое файла, обращая внимание на кавычки и знаки пунктуации.

Если вы используете пакет Mac Perl, просто выберите команду Run "hello" в меню Script, и ваша программа запустится. Если для набора программы вы не пользовались встроенным тестовым редактором, откройте программы с команды Open меню File, а затем выполните команду Run.

28 Часть Основы Perl Заработало! Что же произошло?

Команда perl hello запустила на вашем компьютере программу perl. Эта програм ма называется интерпретатором perl. Интерпретатор — "ум, честь и совесть" Perl. Его задача состоит в том, чтобы открыть указанный в командной строке файл (в данном случае hello), найти в нем программу и выполнить ее.

Под фразой "выполнить ее" я подразумевал следующее. Прежде всего интерпрета тор должен проверить корректность синтаксиса выражений, функций и операторов, составляющих программу на Perl, а затем последовательно все их выполнить.

Интерпретатор perl читает программу с диска и выполняет ее до тех пор, пока она не закончится. После выполнения программы интерпретатор возвращает управление операционной системе.

Теперь посмотрим, как же выполнялась программа hello.

Проследим за Первая строка hello В Perl все, что идет в строке после символа считается комментарием. Коммента рии попросту игнорирует. Однако символы означают нечто другое. После них должен быть указан путь к интерпретатору perl — В UNIX принято, что содержащая в первой строке символы после которых указан путь к ин терпретатору, может запускаться по имени. Обратитесь к разделу "Вопросы и ответы" в конце этого занятия за информацией о запуске программ. Некоторые Web-серверы, например Apache, также используют строку с для запуска программ без непосред ственного вызова интерпретатора perl.

Для нас сейчас это не важно, мы считаем первую строку комментарием.

Следующая строка программы:

print "Hello, В этой строке находится оператор Perl, обозначающий действия, которые должен выполнить Perl. Строка содержит вызов функции print, которой передается строка Hello, World! и символ новой строки. Функция должна отобразить эту строку на экра не. В конце оператора следует точка с запятой.

В Perl символ ;

называется опера Он разделяет операторы в программах и указывает, где конец одного оператора и начало следующего.

В нашем случае функция print отображает фразу Hello, World!. Символы \п в кон це строки говорят о том, что нужно вывести пустую строку после напечатанной фразы. Кавычки, в которые заключена фраза и \п, сообщают Perl о том, что это стро ка, а не другая функция. На следующем занятии мы посвятим строкам достаточно много времени.

Это вы должны знать Программы на Perl можно записывать в свободной форме. Синтаксис языка не требует каких-либо особых форм записи или форматирования текста. Вы можете помещать между операторами пробелы, табуляторы и даже символы перехода на новую строку. Perl все они называются пробелами и никак не влияют на работу интерпретатора.

1-й Начало работы с Perl Конечно, есть определенные места в программе, где нельзя помешать такие сим волы. Например, нельзя вставлять пробелы в имя функции: int неправильное имя функции. Нельзя также вставлять их в числа, скажем, 25 61 — не то же самое, что 2561. Пробелы внутри строки, как, например, в строке "Hello, World!", всегда отобра жаются. За исключением выше случаев, во все остальные места про граммы можно безболезненно помешать символы пробела. Например, вы можете пе реписать программу из рассматриваемого нами примера следующим образом:

print "Hello, World!\n" } Она будет функционировать точно так же, как и оригинал. Эта некоторая вольность Perl позволяет выбирать из множества стилей написания программ тот, который больше всего вам придется по душе. Вы можете совершенно свободно выразить себя в этом. Не забывайте только и о других пользователях, которые, возможно, когда-нибудь обратятся к вашим программам. Постарайтесь сделать ваш код понятным и для них.

Стиль, используемый в наших примерах, достаточно консервативен. Иногда операторы разделяются несколькими пустыми строками, чтобы разделить логические блоки в доста точно длинной программе на Perl. Кстати, в документации Perl приведено описание рекомендуемого стиля оформления программ. Документ этот называется peristyle.

Стили оформления программ в Peri могут быть весьма вычурными. Программы могут быть написаны в столбик, как стихотворение, или в одну строку. Некоторые программисты умудряются оформлять программы в виде рисунка, и, что самое интересное, программы при этом не только не перестают работать, но еще и вы полняют полезную работу! Каждый год The Journal про водит конкурс на самую запутанную Perl-программу — Obfuscated Contest.

Лучше бы вам этого не видеть.

Резюме На этом занятии вы немножко окунулись в мир Perl и увидели, как работает ин терпретатор. По мере чтения книги вы будете узнавать все больше и больше подроб ностей. Вы узнали, как инсталлировать проверить правильность его работы и убедиться, что все установлено должным образом. Вы набрали и, надеемся, запустили свою первую программу на и разобрались, как она работает.

Вопросы и ответы Как называются файлы, которые запускает сценарии или программы?

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

Как хотите — так и понимайте. В этой книге я буду использовать термин программа на Perl, и если вы будете стараться, то, прочитав данную книгу, сможете гордо назы вать себя программистом на 30 Часть I. Основы Perl Необходимо ли все время вручную набирать листинги этой книги? Некоторые из них довольно длинные.

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

В разделе вы упоминали о более простом способе запуска про грамм в UNIX. Что это за способ?

Сначала убедитесь, что в первой строке файла после символов указан правиль ный путь к интерпретатору как правило, или, на некоторых маши нах, Далее вы должны сделать ваш файл выполняемым с помо щью команды Для программы hello команда оболочки UNIX будет выглядеть как +x hello. После этого вы сможете запускать программу на Perl командой hello или называйте в UNIX программу именем test, поскольку в оболочке UNIX уже имеется команда с таким именем. В результате вы не сможете запустить свою программу. Обратитесь к документации по оболочкам, чтобы узнать, каких еще имен следует избегать.

Если вы хотите воспользоваться готовыми файлами с листингами программ, ко торые приведены на компакт-диске, не забудьте изменить первую строку про граммы и указать после символов путь к интерпретатору Perl вашей системы.

В противном случае вам придется запускать программы из командной строки с помощью команды perl как было описано выше, в разделе "Запуск программы".

Семинар Контрольные вопросы 1. Perl — название a perl — это:

а) также название языка;

б) интерпретатор;

в) команда DOS.

2. Откуда всегда можно загрузить копию документации Perl?

а) http://www.microsoft.com б) в) http://www.perl.net 3. На какой странице руководства можно найти описание синтаксиса persyn б) perlop в) perlfaq 1-й Начало работы с Perl Ответы 1. Правильный ответ б), но, поскольку, после установки perl становится ко мандой оболочки DOS, вариант в) также 2. Правильный ответ — вариант б). А также в вашей системе.

3. Правильным будет вариант а), хотя проверить можно, лишь запустив ко манду perl, не правда ли?

Упражнения Попробуйте бегло просмотреть список часто задаваемых вопросов Даже если сначала вам многое покажется непонятным, вы получите ставление о том, какого рода информация содержится в FAQ.

Если вы предпочитаете использовать Web-броузер, "сходите" на узел и прочитайте документацию там, только не переусердст вуйте.

32 Часть I. Основы Perl 2-й час Строительные блоки Perl:

числа и строки Любой язык, будь то компьютерный или "человеческий", предполагает наличие предмета разговора. Perl в основном имеет дело с числами и строками, их объеди няющее название — скаляры.

Скаляры — базовый тип На каждом из занятий этой книги с ними будут про изводиться операции суммирования, вычитания, поиска, проверки, сбора, очистки, разделения на части, упаковки, сортировки, сохранения, загрузки, печати и удаления.

В Perl каждый скаляр (или переменная скалярного типа) может содержать от дельное слово, запись, документ, строку текста или символ. Скаляры могут со держать также литеральные данные, т.е. данные, значение которых не изменяется во время выполнения программы. В некоторых языках программирования для такого рода данных используются термины константа или литерал. Они часто использу ются для хранения значений, не подверженных изменению в силу своей природы, например числа л, или ускорения земного притяжения g, или же имени 15-го пре зидента США. Все подобные числа в программах Perl встречаются в виде скалярных литералов.

Другим типом скаляров Perl являются так называемые скалярные переменные. Пе ременные содержат данные, которыми можно свободно манипулировать. Вы можете изменять содержимое переменных, поскольку они являются всего лишь удобным ин струментом доступа к данным, которые в них хранятся. Обычно переменным назна чают удобные и легко запоминающиеся имена, которые связаны с хранящимися в них данными.

На этом занятии вы также познакомитесь с операторами Perl. Операторы — это своего рода глаголы языка Perl. Они оперируют существительными Perl таким обра зом, чтобы программа выполняла полезные действия.

Основные темы этого занятия.

• Числовые и строковые константы (литералы).

• Скалярные переменные.

• Операторы.

2-й час. Строительные блоки Perl: числа и строки Литералы Perl содержит два различных типа скалярных констант, называемых литералами:

числовые и строковые литералы.

Числовые литералы Числовые литералы — это обычные числа. "понимает" числа, представленные в различных форматах. Все примеры, приведенные в табл. 2.1, являются допустимыми числовыми литералами Perl.

Таблица 2.1. Примеры числовых литералов Число Тип 6 Целое число Вещественное число 15. Еще одно вещественное число.7320508 И еще одно вещественное число Вещественное число, представленное в экспоненциальном формате (число с плавающей точкой) Еще одно число с плавающей точкой (допустимы как символы е, так и Е) Большое целое число. В качестве разделителя тысяч вместо запятых ис пользуется символ подчеркивания Я думаю, здесь нет смысла описывать, что такое числа, поскольку это вам должно быть из курса средней школы. Остановимся только на нюансах. Целые числа представляются набором нескольких цифр. В вещественных числах используется де сятичная точка. Числа с плавающей точкой содержат мантиссу, букву е и порядок числа. В больших числах для удобства чтения можно использовать символ подчерки вания, разделяющий тысячи. Перед тем как использовать такие числа, удаляет символы подчеркивания.

Не ставьте перед числами нули, как, например, в 010. В Perl так обозначаются числа в восьмеричной системе счисления. В Perl также можно использовать чис ла в и двоичной системах счисления. Подробней обо всем этом можно узнать, обратившись к разделу документации Строковые литералы Строковые литералы в Perl — это обычные строки символов. Они могут содержать любое количество данных. Размеры строк ограничены лишь размерами виртуальной памяти вашего компьютера. Строки могут содержать данные различных типов — текст ASCII со стандартным набором символов, текст ASCII с полным набором символов и даже двоичные данные. Строки могут быть также пустыми.

В Perl, за небольшими исключениями, вы обязаны заключать строковые литералы в кавычки. Этот процесс называется (quoting) строки. Для этого можно ис пользовать или одинарные (' '), или двойные кавычки (" ")- Ниже приведено не сколько примеров строковых литералов:

34 Часть I. Основы Perl "Привет!" 'Дело было в веке' "Одна "Мой дорогой Мишель, постарайся все сделать Если внутри двойных кавычек нужно поместить символ кавычки, перед ним необхо димо поставить символ обратной косой черты. Этот символ, используемый внутри строко вого литерала, говорит что идущий за ним символ должен восприниматься как управляющий. Посмотрите на следующую строку, которую Perl поймет неправильно:

тогда я сказал "Иди и принеси мне В ней кавычка перед словом Иди соответствует первой кавычке строки, поэтому фраза Иди и принеси мне это. остается за кавычками так в Perl писать нельзя. Для предупреждения подобной ситуации поставьте перед кавычками, которые должен проигнорировать, символ обратной косой черты, как показано ниже:

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

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

Эти последовательности имеют специальное обозначение, что позволяет включать в строки такие символы, которые сложно или невозможной набрать с клавиатуры или ввести каким-либо другим способом. В табл. 2.2 приведен краткий список управляю щих последовательностей Таблица 2.2. Примеры управляющих Обозначение Описание Новая строка \п Возврат каретки \t Табулятор \b Символ забоя Поднятие регистра следующего символа \ Понижение регистра следующего символа \\ Обратная косая черта в литералах V Одинарная кавычка внутри строки в одинарных кавычках V Двойная кавычка внутри строки в двойных кавычках Полный список управляющих последовательностей можно найти в справочной документации. На предыдущем занятии я уже рассказывал, как обратиться к до кументации с помощью встроенной утилиты Управляющие по следовательности описаны в руководстве под рубрикой perlop в разделе Quote and Quote-like Operators.

2-й час. Строительные блоки Perl: числа и строки При наборе строки с большим количеством кавычек очень легко допустить ошиб ку, поскольку перед каждой внутренней кавычкой нужно обязательно поставить об ратную косую черту, как показано ниже:

тогда я сказал: \"Иди а он ответил:

Поэтому для облегчения процесса квотинга в Perl предусмотрены специальные операторы qq и q. Оператор qq заменяет двойные кавычки и ведет себя почти во всех случаях точно так же, как пара двойных кавычек:

тогда я сказал: "Иди вперед", а он ответил: "Слушаюсь!".) Одинарные кавычки могут быть заменены оператором q:

q('Литералы' нужно заключить в одинарные кавычки) Для обозначения начала и конца строк в операторах qq и q можно использовать любые символы, кроме алфавитно-цифровых. Эти символы называются ограничите лями (delimiters). В предыдущих примерах я воспользовался скобками, но, как я уже говорил, допустимы любые символы, кроме алфавитно-цифровых:

нужно заключить в одинарные кавычки/ q,'Литералы' нужно заключить в одинарные кавычки, Символы, которые вы хотите использовать в качестве ограничителей, следует ука зать сразу после операторов qq или q. Вы можете использовать парные символы — (] строками, содержащими эти символы. Причем, если они идут парами внутри операторов qq и q, обратная косая черта не используется:

(отец Тона) рубил все деревья подряд (кроне самых больших).);

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

(отец Тока) рубил все деревья подряд (кроне самых больших).];

Скалярные переменные ДЛЯ хранения скалярных данных в используются скалярные переменные. Ска лярная переменная обозначается символом доллара и следующим за ним именем пе ременной. Вот несколько примеров скалярных переменных:

$а $Date $cat Символ доллара, называемый идентификатором указывает Perl, что пере менная содержит скалярные данные. Кроме переменных скалярного типа, в Perl су ществуют также переменные других типов (хэши и массивы), для обозначения кото рых предусмотрены специальные символы. Кроме того, в некоторых случаях в именах переменных идентификаторы могут вообще не использоваться (например, для обо значения дескриптора файла). Имена переменных в Perl, независимо от их типа, т.е.

имена хэшей, массивов, дескрипторов файлов и скаляров, должны следовать опреде ленным правилам.

36 Часть I. Основы Perl • Имена переменных должны состоять из идентификатора типа и идущих за ним символов латинского алфавита и цифровых символов или символа подчеркивания. Но первый символ переменной не может быть цифрой.

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

$value Кроме того, в зарезервированы имена некоторых односимвольных перемен ных. Такие переменные, как $_, $/, $2 и $$, называются специальными и их не следует использовать как обычные переменные в Perl-программах. Назначение специ альных переменных будет описано ниже.

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

Для создания скалярной переменной просто используйте ее. Для неинициализиро ванных переменных Perl использует значение, принятое по умолчанию. Если пере менная используется как число (например, в математическом выражении), ее значе ние по умолчанию — 0 (нуль), если переменная используется как строка (т.е. почти во всех остальных случаях), используется "" или пустая строка.

Использование неинициализированных переменных считается образцом плохого стиля программирования. Если Perl запущен из командной строки с ключом или же этот ключ указан в первой строке программы (с символами К!) после име ни интерпретатора, подобные ситуации отслеживаются и выдается соответст вующее предупреждение. Если вы используете неинициализированную перемен ную, выдается ошибка Use of uninitialized value.

Специальная переменная В предусмотрена специальная переменная, значение которой используется во многих выражениях, если явно не указана другая переменная. Речь идет о перемен ной $_. Например, если вызвать функцию print без параметров, будет распечатано те кушее значение переменной $_:

Side of the Moon";

print;

значение переменной "Dark Side... " Подобное неявное использование переменной $_ может создать определенную не разбериху, учитывая, что этой переменной значение может присваиваться задолго до ее применения.

Однако подобная методика удобна в случае применения регулярных выражений, о чем речь пойдет на 6-м занятии, "Поиск по шаблону". В этой книге я старался как можно реже использовать переменную $_, чтобы программы было легче читать.

2-й час. Строительные блоки Perl: числа и строки Выражения и операторы После того как вы познакомились со скалярными типами данных, можно попро бовать сделать что-то полезное на Программа Perl — набор выражений и опера торов, выполняемых последовательно от начала и до конца, если, конечно, вы не из меняете ход программы с помощью специальных операторов, описанных на заня тии, "Управление процессом выполнения программы". Пример готовой программы на Perl приведен в листинге 2.1.

Листинг Пример программы на Perl 1:

-w 2:

4:

5: 2);

6: print $area;

Проведем анализ программы.

• Строка 1. Как вы помните, в этой строке указывается путь к интерпретатору Ключ говорит о том, что нужно выводить все предупреждения.

• Строка 3. В этой строке выполняется оператор присваивания. Скалярной переменной присваивается число 50.

• Строка 5. этой строке также выполняется оператор присваивания. В пра вой части оператора присваивания находится выражение. Выражение содер жит скалярную переменную операторы * и ** (ниже описано их действие) и числовой скаляр 2. Переменной присваивается вычислен ное значение выражения.

• Строка 6. В этой строке распечатывается результат вычислений, находящий ся в переменной это набор операторов, имеющих значение. Например, 2 — допусти мое выражение, как и 54*$r, "Java", sin($pi*8) и $t=6. Значения выражений вычисля ются в ходе выполнения программы. Вначале программа вычисляет значения функ ций, операторов и скалярных констант, составляющих выражение, а затем — резуль тирующее значение. Выражения можно использовать в операторах присваивания, в других выражениях или в операторах Основные операторы Как было показано в листинге 2.1, для присваивания используется оператор при сваивания =. Этот оператор помещает значение выражения, находящегося в правой части, в переменную, указанную в левой части. Например:

ветром";

Оператор, находящийся в правой части, должен иметь определенное значение, кото рое можно присвоить переменной, т.е. правая часть оператора присваивания должна яв ляться выражением. Сама по себе операция присваивания также является выражением, 38 Часть I. Основы значение которого указывается в правой части оператора присваивания. Это означает, что в приведенной ниже строке кода переменным $а, $Ь и $с присваивается значение 42:

$а=$Ь=$с=42;

В этой строке переменной $с присваивается значение 42, затем присваивается значение выражения $с=42 (равное 42). Переменной $а присваивается значение выра жения Переменная, которой присвоено значение, может использоваться в пра вой части оператора присваивания, как показано ниже:

Правая часть выражения оператора присваивания вычисляется с использованием старого значения переменной $а или Оператор присваивания во второй строке имеет специальное название в Perl — инкремент. Мы еще остановимся на таких опе раторах подробнее.

Числовые операторы У Perl имеется несколько операторов, которые предназначены для использования в числовых выражениях. Некоторые из них вам уже встречались, а с остальными мы сейчас познакомимся. Первой разновидностью уже знакомых вам операторов являют ся арифметические операторы. В табл. 2.3 приведен их список.

Таблица 2.3. Арифметические операторы Пример Название оператора Значение выражения 5 + $t Сложение Сумма 5 и $t Sy - $х Вычитание Разница между $у и $х $е * $pi Умножение Произведение $е на $pi $f / б Деление Частное от деления $f на 24 % Остаток от деления Остаток от деления 24 на 5 (4) 4 ** 2 Возведение в степень 4 в квадрате Арифметические операторы выполняются в порядке приоритетов, принятых в ма тематике: сначала возведение в степень, затем умножение, деление, вычисление ос татка от деления и только затем сложение и вычитание. Если вы не уверены;

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

5*6+9;

Значение I Значение Значение Строковые операторы Perl может оперировать не только числами, но и строками. Первым строковым оператором, который мы рассмотрим, является оператор конкатенации (.)• Этот опе ратор берет строку, находящуюся слева от него, и строку справа и возвращает строку, объединяющую предыдущие две, например:

2-й час. Строительные блоки Perl: числа и строки Свет!";

Как я рад тебя видеть";

$с=$а.

В этом примере переменные $а и $Ь имеют простые строковые значения. В по следней строке переменной $с присваивается значение Привет, мой Свет! Как я рад тебя видеть, при этом значения переменных $а и $Ь не изменяются.

Конкатенацию строк можно выполнить и другим способом. Раньше мы уже говорили, что внутри строк, заключенных в двойные кавычки, Perl "выискивает" имена переменных.

Найденные переменные интерпретируются. Это означает, что имя переменной внутри строки в двойных кавычках заменяется реальным значением этой переменной, например:

print "Привет, В этом примере Perl ищет в строке в двойных кавычках имена переменных, нахо дит имя $name и подставляет вместо него строку Джон. Этот процесс называется интер значения переменных. Для того чтобы переменные не интерпретировались, нужно заключить строку в одинарные кавычки (тогда Perl вообще никак не будет ана лизировать эту строку) или поставить обратную косую черту перед идентификатором имени переменной, например:

print 'Я использую переменную будет печатать слово "Ringo" print "Я использую переменную \$name";

Также не будет печатать слово "Ringo" Оба оператора print из предыдущего примера напечатают строку Я использую пере менную $name, при этом переменная Sname не будет интерпретирована. Итак, оператор конкатенации можно заменить строками в двойных кавычках следующим образом:

груши";

Там, где Perl не может четко выделить имя переменной из остальной части строки, заключите имя переменной в фигурные скобки {}. Подобный прием позволяет Perl легко определить имя переменной, например:

print "I went to the fair on ${date}day";

Без этих скобок непонятно, какую переменную должен интерполировать Perl — $date или $dateday. Фигурные скобки однозначно указывают, что $date.

Следующим строковым оператором является оператор повторения х. В операторе х указываются два аргумента — строка, которую необходимо повторить, и число повто рений. Например:

$line="-" х 70;

В предыдущем примере символ повторяется 70 раз оператором х. Результат со храняется в переменной $line.

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

40 Часть I. Основы Perl Унарные операторы До сих пор все встречавшиеся вам операторы имели по два аргумента. Для деления 6/3 нужен числитель б и знаменатель 3, для умножения 5*2 нужны множители 5 и 2 и т.д. Другой тип операторов — операторы с одним аргументом (операндом). Скорее всего, вы уже знакомы с одним представителем операторов такого рода — унарным минусом (-). Унарный минус изменяет знак своего аргумента, например:

6;

Шесть -6 f Минус шесть Пять, минус на минус дает В отличие от унарного минуса, большинству операторов назначены имена.

Операнды именованных унарных операторов заключать в скобки необязательно (в табл. 2.4 они приведены лишь для удобства). Поскольку именованные операторы в Perl напоминают функции, то их операнды иногда называют аргументами, т.е. терми ном, принятым для параметров функций Perl.

Краткий список именованных операторов приведен в табл. 2.4.

Таблица 2.4. Некоторые именованные унарные операторы Perl Оператор Пример использования Результат Возвращает целую часть аргумента (5) int length Возвращает длину строки-аргумента (4) Переводит все символы строки аргумента в lc("ME TOO") нижний регистр too") Действие, обратное действию предыдущего оператора ("HAL 9000") Косинус радиан (.964966).

rand rand(5) Возвращается случайное число в диапазоне от 0 до указанного в аргументе;

если аргу мент возвращается случай ное число в диапазоне от 0 до Полный список именованных операторов приведен в документации На 1 м занятии, "Начало работы с Perl", рассказывалось о том, как получить доступ к раз делам документации с помощью утилиты perldoc, которая входит в поставку Полный список операторов находится на страницах руководства perlop и На последующих занятиях, по мере необходимости, будут представлены и некоторые другие операторы.

Инкремент и декремент В разделе "Числовые операторы" мы уже говорили о специальном типе операторов присваивания, называемом инкрементом, выглядевшем тогда так:

Инкремент обычно используется для подсчета чего-либо, например количества встретившихся записей или для генерации последовательных номеров (например, ну мерации элементов списка). Вы можете в этих целях использовать специальный опе час. Строительные блоки Perl: числа и строки ратор, называемый оператором автоинкремента (++). Этот оператор прибавляет к опе ранду единицу:

После выполнения этой строки кода значение переменной увеличивается на единицу.

В Perl есть оператор для уменьшения значения переменной, который, как вы уже могли сами догадаться, называется оператором автодекремента (--). Автодекремент используется точно так же, как и автоинкремент:

Значение переменной становится Перед тем как завершить описание этих операторов, следует упомянуть еше об одном любопытном свойстве автоинкремента. Речь идет о применении этого опера тора к строке алфавитно-цифровых символов, что приводит к очень интересному результату! Данная операция влияет на последний (самый правый) символ строки — его значение увеличивается на 1, при этом буквенный символ заменяется следую щим символом алфавита. Ниже приведены примеры действия оператора автоин кремента на строки.

$а++;

print $a;

как н следовало ожидать, напечатает 1000.

$а++;

print $а;

напечатает dO. 9+1=10, с заменяется следующим \ символом алфавита d.

print $a;

t напечатает Оператор автодекремента не выполняет подобных УГЛОВОЙ оператор Угловой оператор (о), иногда из-за своей формы называемый "бубновым", преж де всего, используется для чтения и записи файлов (подробнее об этом речь пойдет на 5-м занятии, "Работа с файлами"). Однако, чтобы сделать примеры более интерес ными, мы начнем его использовать раньше, и к 5-му занятию он уже будет нам хо рошо знаком.

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

print "Какой у вас размер обуви?

print "Ваш размер ~ за внимание";

42 Часть I. Основы Perl После выполнения этого кода (предположим, что в качестве размера обуви вы ука зали число 45) на экран будет выведено следующее:

Какой у вас размер обуви? Ваш размер обуви — Спасибо за внимание Оператор читает вводимые с клавиатуры символы до тех пор, пока пользо ватель не нажмет клавишу Затем введенная строка помещается в перемен ную Ssize. Строка текста, возвращаемая оператором , содержит символ перево да введенный пользователем при нажатии клавиши . Обычно не жела тельно, чтобы в конце введенной строки находился символ перевода строки, т.е. тре буемая строка должна содержать лишь текст. Для удаления символа перевода строки можно воспользоваться оператором chomp:

print у вас размер обуви? ";

chomp $size;

print "Ваш размер обуви — $size. Спасибо за Оператор удаляет в строке-аргументе завершающий символ перевода строки.

Он также возвращает количество удаленных символов — обычно это 1, но иногда О, если ничего не удалено.

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

переменная выражение Эта строка равносильна следующей:

оператор выражение Использование подобных операторов обычно не сделает вашу программу более чи табельной, но сделает ее короче. Согласно вышеописанному правилу, оператор $а=$а+3;

можно сократить до $а+=3;

А вот еще несколько примеров:

- это конец строки";

I Фраза дописывается к $line;

$у*=$х же, что и $у=$у*$х Остаток от деления на 67 помещается в Несколько слов о строках и числах Perl позволяет использовать в выражениях как строки, так и числа. При этом, в за висимости от ситуации, Perl выполняет автоматическое преобразование чисел в стро ковое представление и наоборот. Ниже приведено несколько правил, которыми руко водствуется 2-й час. Строительные блоки Perl: числа и строки • Если из строки можно без проблем вьщелить число, Perl использует число, например:

$а=42;

Число print $a+18;

Печатает. * Строка print Печатает • Если число используется в строковом выражении, Perl преобразовывает чис ло в строку, например:

$а=42/3;

Число $а=$а, Используется число как строка Print $a;

Печатает • Если в выражении строка используется там, где должно быть число, ис пользует число 0, например:

$a="Hello, World!";

print $a+6;

Печатает число Однако, если включен режим вывода предупреждений, в последнем случае Perl выдаст соответствующее сообщение.

Все эти примеры иллюстрируют философию, свойственную — философию "минимальной неожиданности". Даже получив абсурдные аргументы, как в предыду щем примере, Perl пытается сделать с ними нечто осмысленное. Если вы включили режим вывода предупреждений, указав ключ -v в первой строке вашей программы или в командной строке, Perl предупредит вас, что совершает бессмысленное дейст вие, следующим сообщением: Argument X isn't numeric.

Упражнение: вычисление сложных процентов ДЛЯ ЭТОГО упражнения мы выбрали задачу вычисления сложных процентов. Про грамма будет высчитывать доход, исходя из информации о процентных ставках, сумме депозита и времени хранения. Мы будем при этом использовать следующую формулу:

\ Сумма = Взнос Наберите в текстовом редакторе программу, приведенную в листинге 2.2, и назо (1 + Процентная ставка ) вите ее interest. Номера строк набирать не нужно. Сделайте файл interest Процентная ставка мым, следуя инструкциям, приведенным на 1-м занятии.

После этого попытайтесь запустить программу, набрав в командной строке perl interest В листинге 2.3 приведен пример вывода программы interest.

Листинг 2.2. Полный исходный код программы interest 1:

-v 2:

3: print "Величина месячного взноса?

4:

5: chomp 6:

44 Часть I. Основы Perl 7: print "Годовая процентная ставка? (пример 7% —.07) ";

8:

9: chomp $interest;

10:

депозита в месяцах? ";

$mons;

14:

В формуле заложена месячная процентная ставка 16:$interest/=12;

17:

18:$total=$pmt * ( ( 1 + $interest) ** -1) )/ 19:

$mons месяцев при ежемесячной ставке $interest \n";

"у вас будет сумма $total.\n";

I. Проведем анализ программы.

• Строка 1. В этой строке находятся имя программы интерпретатора (вы мо жете изменить его в соответствии с конфигурацией вашей системы) и ключ Всегда включайте режим вьщачи предупреждений!

• Строка 3. Пользователь вводит размер месячного взноса.

• Строка 4. Значение переменной $pmt считывается со стандартного устройст ва ввода (клавиатуры).

• Строка 5. Удаляется символ перевода строки в конце • Строки 7~9. Считывается с клавиатуры значение переменной и удаляется символ перевода строки.

• Строки Считывается с клавиатуры значение переменной и уда ляется символ перевода строки.

• Строка 16. Содержимое переменной $interest делится на 12, результат по мешается в переменную $interest.

• Строка 18. Вычисляются сложные проценты, результат заносится в пере менную • Строки Печать результатов.

Листинг 2.3, Пример работы программы interest 1: Величина месячного взноса? 2: Годовая процентная ставка? (пример —.07). 3: Период депозита в месяцах? 4: После 120 месяцев при ежемесячной ставке 0. 5: у вас будет сумма 61652.767054031.

2-й час. Строительные блоки Pert: числа и строки Резюме На этом занятии вы узнали, что основным типом данных в Perl является скаляр.

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

Вопросы и ответы Вывод программы interest выглядит неряшливо. Как можно указать, сколько деся тичных знаков нужно выводить?

Проще всего управлять количеством выводимых десятичных знаков с помощью функ ции printf (), описанной на 9-м занятии, "Дополнительные функции и операторы".

Имеется ли в функция для округления?

Функция printf () округляет числа при выводе. Если вам необходима функция round{), воспользуйтесь модулем содержащим как эту функцию, так и многие другие функции.

Какое минимальное и максимальное значение числа допускается в Perl?

Ответ на данный вопрос зависит от того, какая у вас операционная система. В числах двойной точности с плавающей точкой в типичной Intel-совместимой UNIX системе можно использовать более чем 300-значные числа. Обычно для вычислений вполне достаточно разрядов.

Семинар Контрольные вопросы 1. Внутри оператора qq переменные интерпретируются:

а) да;

б) нет.

2. Определите значение переменной $с после выполнения следующего фраг мента кода:

$а=6;

$Ь-;

а) 6;

в) 8.

46 Часть I. Основы Perl 3. Конкатенация может быть выполнена лишь с помощью оператора конкате нации а) да;

б) нет.

Ответы 1. Правильный ответ — вариант а). Действие оператора qq аналогично дейст вию двойных кавычек. Это означает, что переменные интерпретируются внутри этого оператора.

2. Правильным будет вариант а). Вначале переменной присваивается зна чение б, затем увеличивается до 7 и присваивается переменной $Ь. Затем значение переменной уменьшается до и присваивается $с.

3. Правильный ответ — вариант б). В Perl любое действие можно выполнить несколькими способами. Конкатенацию двух или более скаляров можно произвести, заключив их имена в двойные кавычки:

qq($a$b$c);

Упражнения Напишите короткую программу, запрашивающую значение температуры по Фаренгейту и переводящую ее в температуру по Цельсию. Для перевода температуры по Фаренгейту в шкалу Цельсия нужно вычесть из температуры 32 и умножить полученное значение на 5/9. Например, 75 градусов по Фа ренгейту соответствуют градуса по Цельсию.

Модифицируйте программу interest таким образом, чтобы выводимые ре зультаты содержали не более двух десятичных знаков. Этого можно добиться без printf (), лишь с помощью умножения, деления и оператора int.

2-й час. Строительные блоки Perl: числа и строки 3-й час Управление процессом выполнения программы На 2-м занятии, "Строительные блоки Perl: числа и строки", речь шла об операто рах и выражениях. Для всех примеров этого занятия характерным было то, что опера торы в них выполнялись последовательно друг за другом и только один раз.

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

Другим достоинством компьютера является возможность быстрого принятия ре шений. Было бы очень неудобно, если бы компьютер при необходимости принять ка кое-либо решение обязательно запрашивал команду пользователя. Во время обычного процесса получения и чтения сообщения электронной почты компьютер без вашего непосредственного участия должен принять огромное количество решений: как объе динить фрагменты сетевого трафика, определить цвет каждого пикселя на мониторе, как прочитать и отобразить сообщение, что делать при изменении положения указа теля мыши, и бесчисленное множество других. Многие из этих решений влекут за со бой принятие других решений, причем некоторые из них нужно принимать тысячи раз в секунду. На этом занятии мы расскажем об условных операторах. С их помощью можно создать блоки кода, которые будут выполняться в зависимости от решения, принятого программой.

Основные темы этого занятия.

• Блочные структуры.

• Операторы.

• Циклы.

• Метки.

• Выход из после выполнения программы.

48 Часть I. Основы Perl Блоки Простейшим способом объединения нескольких операторов Perl является блок.

Для образования блока достаточно заключить группу операторов в фигурные скобки:

{ оператор_6;

} Внутри блока операторы выполняются последовательно, как и раньше. Блоки мо гут состоять из других блоков, например:

оператора;

i оператор_6;

Для вообще и для блоков, в частности, характерно свободное форматирование.

Другими словами, операторы и фигурные скобки могут находиться в одной или раз личных строках. Допустим любой тип выравнивания, единственное условие — чтобы все фигурные скобки имели пару, например:

{ оператор;

{ другой_оператор;

} { } } Несмотря на то что вы можете располагать код в блоках как вам заблагорассудится, беспорядочное нагромождение операторов затрудняет чтение программы. Необяза тельные, но желательные отступы делают программу Perl удобочитаемой.

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

Оператор if Для управления условным выполнением операторов Perl обычно используется опе ратор if. Синтаксис этого оператора приведен ниже:

if (выражение) БЛОК Работает оператор if так: если выражение истинно, блок кода выполняется. Если выражение ложно, блок кода не выполняется. Рассмотрим пример:

if < 5 ) { print 'Переменная $г равна 5.';

} В этом примере проверяется значение переменной на равенство 5. (Символы == — это оператор равенства;

не путайте его с оператором присваивания =.) Если опе ранды с обеих сторон этого оператора (в нашем случае и 5) численно равны, выра жение считается истинным и выполняется оператор print. Если значение не рав но 5, оператор print не выполняется.

3-й час. Управление процессом выполнения программы Оператор if позволяет также выполнить один фрагмент кода, если некоторое усло вие истинно, и другой фрагмент кода — если это условие ложно. Это достигается с помощью использования оператора Его синтаксис имеет вид if (выражение) Если выражение истинно...

БЛОК этот блок кода.

Else БЛОК В противном случае выполняется этот блок.

Блок, следующий за выражением, выполняется, если оно истинно, а блок после ключевого слова else — если выражение ложно. Приведем пример использования описываемого оператора:

$r=;

chomp if ($r == 10) { print '$r равно 10';

} else { print '$r не равно 10...';

print '$r присвоено значение 10';

Обратите внимание, что в предыдущем примере для присваивания значения пере менной используется оператор =. Для проверки значения используется оператор равенства ==. Это два совершенно разных оператора с абсолютно различным дейст вием. Не путайте их, иначе отладка ваших программ может сильно усложниться. Пом ните, что с помощью оператора = значения присваиваются переменным, а с помощью оператора == — выражение проверяется на равенство определенному значению.

Существует еще одна разновидность оператора if, с помощью которой можно прове рить значения нескольких выражений и выполнить код, соответствующий истинному условию:

if (выражение!) Если 1 истинно...

БЛОК1 этот блок кода.

elseif Иначе, если истинно...

БЛОК2 этот блок кода.

else Если одно из выражений не истинно, БЛОКЗ выполняется этот блок.

Данный оператор выполняется следующим образом: если выражение, помеченное как выражение!, истинно выполняется блок кода БЛОК!. Иначе управление передается оператору elseif и проверяется значение выражения2. Если ни ни не являются истинными, выполняется БЛОКЗ. Для демонстрации такой синтаксической конструкции рассмотрим реальный фрагмент программы на Perl:

if == 10) { print '$г равно 10!';

} elseif == 20) { print '$r равно 20!';

} else { print '$r не равно ни 10, ни 20';

50 Часть I. Основы Perl Другие операторы отношения До сих пор мы сравнивали значения лишь с помощью оператора равенства ==. В Perl имеется ряд операторов, предназначенных для сравнения численных значе ний, большинство из них представлены в табл. 3.1.

Таблица 3.1. Числовые операторы отношения Оператор Обозначение Пример Описание Истина, если $х равно $у Равенства == $х == $у > Больше чем ?х>$у Истина, если $х больше $у < Меньше чем $х<$у Истина, если $х меньше $у >= Истина, если $х больше или равно $у Больше или равно $х >= $у <= Истина, если $х меньше или равно Меньше или равно $х $у Истина, если $х не равно $у ! = $х != $у Не равно Эти операторы могут использоваться в любом месте программы для сравнения численных значений, например в операторе if, как показано в листинге Листинг Игра в угадайку 1:

2:

3: 10);

4: print "Введите от 0 до 9:";

5:

6: chomp i Be забудьте удалить символ новой строка!

7:

8: if { Э: print 10: } < { 11: print 12: } else { 13: print "Вы 14:} Проведем анализ программы.

Строка 1. Это стандартная первая строка программ на В ней указывается Полный путь к программе-интерпретатору, а ключ активизирует режим выда чи предупреждений. На 1-м занятии, "Начало работы с Perl", мы говорили о том, что в каждом конкретном случае эта строка может несколько видоизменяться.

Строка 3. Функция rand 10 генерирует случайное число в диапазоне от 0 до 10, а оператор int() возвращает его целую часть. Затем получившееся целое число от 0 до 9 присваивается переменной Строки В этом месте программы у пользователя запрашивается значе ние, которое присваивается переменной $guess. С помощью функции chomp завершающий символ перевода строки удаляется.

3-й час. Управление процессом выполнения программы • Строки 8—9. Если значение переменной больше, чем переменной выводится соответствующее сообщение.

• Строки Если же значение переменной $guess меньше, чем перемен ной выводится другое сообщение.

• Строки Оставшийся вариант — пользователь угадал число.

Операторы в табл. 3.1 используются для сравнения лишь численных значений. Их использование для сравнения нечисловых данных приводит к неожиданному резуль тату. Рассмотрим пример:

if ($first == $last) { t == - совсем не то, что ожидали!

Print "Значения переменных } В результате выполнения этого фрагмента кода окажется, что значения перемен ных $first и $last численно равны. На 1-м занятии, "Начало работы с Perl", говори лось, что если нечисловые строки используются там, где Perl ожидает встретить число, то вместо них подставляется нулевое значение. Поэтому предшествующее выражение оператора if в Perl равносильно следующему: if { 0 0 ). Это выражение истинно, и результат действия оператора if совсем не такой, как вы, вероятно, ожидали.

Если режим вывода предупреждений включен, то сравнение двух нечисловых значений (в предыдущем примере это Simon и simple) с помощью оператора == приведет к появлению соответствующего сообщения.

Для сравнения нечисловых значений используйте другие операторы Perl, приве денные в табл. 3.2.

Таблица 3.2. Строковые операторы отношения Оператор Обозначение Пример Описание Равенства $s eq Истина, если строка в переменной $s совпадает со строкой $t Больше чем gt $s gt $t Истина, если строка в переменной Ss больше значения переменной $t Меньше чем $s $t Истина, если строка в переменной Ss меньше значения переменной $t Больше или равно $s ge $t Истина, если строка в переменной больше или равна значению пе ременной $t Меньше или равно 1е $s $t Истина, если строка в переменной $s меньше или равна значению пе ременной $t Не равно $s $t Истина, если строка в переменной пе $s не равна строке $t Часть Основы Perl Данные операторы выполняют анализ текстовых строк на основе сравнения ASCII-кодов соответствующих символов, начиная с первого. Это означает, что строки, расположенные первыми в алфавитном порядке, имеют высший приоритет. Таким образом, наибольший приоритет имеют знаки пунктуации, затем числа, прописные буквы и, наконец, строчные буквы. Например, строка 1506 больше строки а та, в свою очередь, больше строки happy.

Что есть Истина в Perl До сих пор мы свободно пользовались термином истины: "если это выражение ис тинно...", не имея его формального определения. В Perl есть несколько коротких пра вил относительно того, что истинно, а что ложно. Правила эти таковы:

• число 0 имеет значение Ложь;

• пустая строка ("") или строка "0" имеет значение Ложь;

• неопределенные значения имеют значение Ложь;

• все остальные значения считаются истинными.

Логично, не правда ли? Единственно, о чем еще следует помнить перед тем, как проверить на истинность некоторое выражение, его необходимо упростить: опреде лить значения вызываемых функций и арифметических выражений. Затем полученное значение выражения нужно перевести в скалярный вид и только тогда решить, ис тинно Постарайтесь осмыслить эти правила и посмотрите табл. 3.3. Попробуйте сначала сами определить, какое выражение истинно, а какое ложно.

Таблица 3.3. Примеры истинных и ложных выражении Выражение или Ложь?

0 Ложь. Число 0 имеет значение Ложь 10 Истина. Ненулевое число 9>8 Истина. Операторы отношения возвращают значения Истина или Ложь, как и следует ожидать -5+5 Ложь. Значение этого выражения — число 0, имеющее значение Ложь 0.00 Ложь. Это представление числа 0, как и 0x0, 00, ОЬО и ОеОО Ложь. Этот случай явно указан в правилах Истина. Так как в кавычках находится пробел, строка считается непустой "0.00" Истина. Удивлены? Это уже строка, причем не "" или "0" "00" Истина. По тем же причинам ложь. Сначала вычисляется значение выражения, которое равно Пока в операторе if мы использовали только операторы отношения, хотя, в ципе, можно использовать любое выражение, которое в конечном счете будет приво диться к значению Истина или Ложь.

Анализируется значение скалярной переменной $а • и определяется его логическое значение if ($a) {... } 3-й час. Управление процессом выполнения программы Вычисляется длина переменной она ненулевая, логическое значение выражения - Истина.

If (length(Sb)) {.... } В имеется специальное значение — undef. Оно присваивается всем неинициа лизированным переменным. Кроме того, некоторые функции в случае неудачного ис хода их выполнения возвращают это значение. Значение undef трактуется интерпрета тором как неопределенное. Оно не равно нулю или любому значению в привычном понимании этого слова. При проверке на истинность, например в операторе if, undef всегда имеет логическое значение Ложь. В арифметических выражениях вместо undef всегда подставляется 0.

Использование неинициализированных переменных обычно свидетельствует об ошибке в программе. Если в программе на с включенным режимом вывода предупреждений значение undef используется в выражениях или передается в виде аргумента функциям — появляется сообщение Use of uninitialized value.

Логические операторы Допустим, вам требуется написать код, выполняющий что-либо, если переменные $х и $у имеют истинное значение, a $z — ложное. Такой код можно реализовать с мощью плохо читаемого набора операторов if:

if ($х) { if ($z) { Ничего не происходит } else { print условие достигнуто. \п В имеется целый класс операторов, предназначенных для объединения логи ческих выражений. Это так называемые логические операторы, которые описаны в табл. 3.4.

Таблица 3.4. Логические операторы Оператор Обозначение Альтернативное Пример Описание обозначение Логическое И $s $t Истина, только если and $s и $t имеют истин ное значение $q and Истина, только если $р $q и имеют истин ное значение Логическое ИЛИ $s $t Истина, если $s или $t имеют истинное значение Часть I. Основы Perl Окончание табл. 3. Обозначение Альтернативное Пример Описание Оператор обозначение $q or $p Истина, если $д или $р имеют истинное значение Отрицание Истина, если имеет not ложное значение not $m Истина, если $т имеет ложное значение Предыдущий пример можно переписать с помощью операторов из табл. 3.4 сле дующим образом:

if ($x and $y not { print "Нужное условие достигнуто. \п";

Выражения, объединенные логическими операторами, вычисляются слева направо до тех пор, пока не появится возможность заранее определить значение всего логиче ского выражения (листинг 3.2).

Листинг Примеры использования логических выражений $а=0;

$b=l;

if {$a and $b) { print 'Переменные $а и $b истинны';

} if $b) { print 'Хотя бы одна из переменных $d или $Ь истинна';

} if {$d or not $b or $c) { print 'Переменная $d истинна, или $Ь ложна, или $с истинна';

Проведем анализ программы.

Строка 1. В этой строке переменным присваиваются значения.

Строка 3. Вначале определяется логическое значение переменной $а. По скольку оно ложно, выражение с использованием оператора and никогда не может быть истинно. Поэтому логическое значение переменной не опре деляется — в этом нет необходимости, ведь уже известно, что выражение ложно. В результате оператор print не выполняется.

Строка 4. Вначале определяется логическое значение переменной $d. Оно ложно, но все выражение с оператором or все еще может быть истинным, по этому вычисляется логическое значение переменной $Ь, оно истинно, значит, и все выражение истинно, следовательно, оператор print выполняется.

Строка 5. Вначале определяется логическое значение переменной $d. Оно ложно, но, несмотря на это все, выражение может быть истинным по той же причине, что и в строке 4, — в нем содержится логический оператор or. Зна 3-й час. Управление процессом выполнения программы чение переменной $b истинно, следовательно выражение not $b — ложно. Ис тинность или ложность всего выражения не установлена, осталось прове рить значение переменной $с. Эта переменная имеет истинное значение, сле довательно, и все выражение истинно, и оператор print выполняется.

Выше была описана особенность определения значения логических выражений, которая состоит в том, что при первой же возможности установить истинность всего выражения, дальнейшие вычисления не производятся. Эта особенность имеет специ альное название — логических выражений. Она позволяет про граммистам на Perl конструировать простые операторы управления процессом выпол нения программы без логических операторов и даже вообще без оператора $а и истинны.';

($а and $b) or или обе переменные $а или $Ь ложны.";

В предыдущем примере, если одна из переменных $а или имеет значение Ложь, будет вычисляться правая часть оператора or, и значение переменной $message моди фицировано. Если же обе переменные истинны, значение выражения or также будет истинно, поэтому правая часть оператора or не выполняется. В результате значение переменной не меняется. В этом примере использован побочный эффект ко операторов or и and для изменения значения переменной Строго говоря, операторы [ | и or не эквивалентны. Отличие состоит в том, что оператор | [ имеет более высокий приоритет, чем or. Это означает, что при про чих равных условиях в выражениях в первую очередь будут выполняться опера торы аналогично тому, как в арифметических выражениях операции умноже ния выполняются перед операциями сложения. Данное замечание относится и к парам и Однако для большей надежности используйте скобки, требуемый порядок вычисления выражения..

Интересно то, что логические операторы не просто возвращают значение Исти на или Они возвращают последнее вычисленное значение. Например, выражение 5 7 возвращает значение 7 (оно является истинным), поскольку в данном случае оно было вычислено последним. Такое свойство логических выражений позволяет ис пользовать приведенные ниже конструкции.

Переменной $nev присваивается старое значение, в случае истинности значения переменной $old.

f в противном случае присваивается строка "default".

"default";

Это выражение выглядит намного изящнее, чем следующее:

if $old) { Если значение $old не определено или ложно?

Циклы В начале этой главы говорилось о том, что принятие решений и условное выпол нение кода — не все, что может понадобиться от программы. Иногда еще нужно многократно выполнять некоторый фрагмент кода. Выше, в листинге 3.1, мы рас 56 Часть I. Основы Perl сматривали пример игровой программы угадывания чисел. Было бы неплохо ее усо вершенствовать и дать пользователю несколько попыток. Для этого необходимо реа лизовать условный повтор определенных фрагментов кода, что легко можно сделать с Организация циклов с оператором while ЦИКЛЫ while считаются наиболее простыми. Оператор while повторяет блок кода до тех пор, пока некоторое выражение истинно. Вот синтаксис этого оператора:

while {выражение) БЛОК Когда интерпретатор Perl встречает оператор while, проверяется выполнение усло вия. Если выражение истинно, выполняется БЛОК кода. После выполнения всего блока повторно вычисляется значение выражения, если истинно, блок повторяется (листинг 3.3).

Листинг 3.3. Пример цикла while 1:

2: while < 10 ) { 3: print итерация 4:

5: } Проведем анализ программы.

• Строка 1. Переменной присваивается нулевое значение.

• Строка 2. Вычисляется значение выражения < 10. Если оно истин но, выполняется блок кода.

• Строка 4. Значение переменной увеличивается на единицу.

• Строка 5. Фигурная скобка } закрывает блок, начинающийся в строке 2 с {.

В этот момент Perl возвращается в начало цикла while и заново вычисляет выражение в круглых скобках.

Организация циклов с оператором Оператор for — более сложная, но в то же время более универсальная конструкция для организации циклов в Perl. Его синтаксис выглядит так:

for (инициализация;

инкремент) БЛОК Три раздела оператора for, инициализация, условие и инкремент, разделены точками с запятой. Когда Perl встречает оператор for, выполняется следующая последователь ность действий.

• Вычисляется выражение инициализации.

• Вычисляется выражение, задающее условие окончания цикла. Если оно ис тинно — выполняется БЛОК кода.

3-й час. Управление процессом выполнения программы • После выполнения блока производится приращение счетчика и снова про веряется условие. Если оно по-прежнему истинно, блок кода выполняется повторно. Этот процесс продолжается до тех пор, пока не перестает выпол няться условие.

Ниже приведен пример цикла for:

for ( $а=0;

$а<10;

$а=$а+2 J { print "А равно } Здесь переменной $а присваивается значение 0, затем выполняется проверка усло вия $а<10, оказавшегося истинным. В теле цикла выводится сообщение. Затем значе ние переменной $а увеличивается на 2: $а=$а+2. Снова выполняется проверка и цикл.

Это продолжается до тех пор, пока $а станет равно 10. В этом случае проверочное ус ловие ложно, и программа выходит из цикла.

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

Инициализация значения переменной цикла for { ;

) { print } print "Цикл Другие средства управления программой Управлять процессом выполнения программы с помощью циклов и условных опе раторов достаточно удобно, но для создания программ с прозрачной структурой нуж ны и другие операторы управления. Действительно, в имеются операторы для досрочного завершения цикла while, для пропуска определенной части цикла for, для выхода из блока условного оператора if и для выхода из программы вообще. Некото рые из перечисленных конструкций рассмотрены в этом разделе. Их использование может облегчить чтение программы.

Альтернативная запись оператора if Оператор if может иметь другой синтаксис. Если внутри блока имеется только од но выражение, оно может предшествовать if. Так, вместо кода if {выражение;

} можно написать:

выражение if (условное выражение);

Ниже приведено несколько примеров подобного синтаксиса:

$correct=l if == $question);

print не число if ( $ratio != 3.14159);

58 Часть I. Основы Perl Этот синтаксис в Perl используется для ясности, поскольку обычно легче читать код, в котором действие предшествует условию. Перед оператором if может быть только од но выражение, а в конце оператора обязательно должна быть точка с запятой.

Операторы управления циклами Кроме блоков, операторов for, while, if, управляющих порядком выполнения бло ков, в Perl имеются операторы для управления программой внутри самих блоков.

Одним из таких операторов является last. С его помощью можно выйти из внут реннего выполняемого блока цикла. Вот пример:

{ last if ($i==5);

Оператор last позволяет досрочно завершить выполнение цикла while, если значе ние переменной $i равно 5. При этом не нужно дожидаться, пока условное выраже ние примет ложное значение. В случае использования вложенных циклов оператор last завершает выполнение текущего внутреннего цикла.

Приведенная в листинге 3.4 программа находит все пары чисел меньше 100, про изведение которых равно 140, например 2 и 70, 4 и 35 и т. д. Делается это крайне не эффективно, но нас будет интересовать в основном использование оператора last.

Как только очередная пара найдена и выведена на экран, программа выходит из внут реннего цикла с итерацией $j. При этом внешний цикл (с инкрементом $i) про должает выполняться и снова запускает внутренний цикл.

Листинг 3,4. Нахождение пар чисел 1:

2:

3: if <$i * $j == 140) { 4: print "Произведение $i и $j равно 140\n 5: last;

} } Кроме last, в Perl существует также оператор next. Он завершает текущую итера цию цикла и передает управление в начало цикла, например:

for <$i=0;

$i<100;

$i++) { next if (not $i % 2);

print "Число =$i } Этот цикл выводит все нечетные числа в диапазоне от 0 до 100. Оператор next запускает следующую итерацию цикла, если $i содержит четное число. Выражение $i 2 возвращает остаток от деления $i на 2, а оператор not инвертирует получен ное логическое значение. Таким образом, если число четное, оператор print про пускается. Естественно, что существуют более удачные алгоритмы поиска нечетных чисел, но тогда мне пришлось бы придумать другой пример для иллюстрации опе ратора next.

3-й час. Управление процессом выполнения программы Метки позволяет помечать блоки и некоторые операторы циклов (for или while). Для этого перед блоком или оператором помешают специальный идентификатор, который называется меткой, например:

{ } Предыдущий блок помечен как MYBLOCK. Имена меток следуют тем же правилам, что и имена переменных, за небольшим исключением: в отличие от имен перемен ных, метки не должны иметь символов наподобие $, Важно также, чтобы имена меток не совпадали с зарезервированными словами Perl. Хорошим стилем является использование в именах меток только прописных букв. Это позволит избежать кон фликтов имен с настоящими и будущими служебными словами Perl. Операторы for и while также могут быть помечены, например:

OUTER: while ) { INNER: while ($expr) { операторы;

Метку можно указывать в качестве аргумента в таких операторах, как last и next.

Это позволяет досрочно завершить выполнение любого блока операторов. В листин ге 3.4 мы находили пары чисел, произведение которых равно 140, с использованием вложенных циклов for. А теперь представьте, что нам нужно найти только первую па ру множителей. Чтобы выйти из обоих циклов после нахождения результата, потребу ется сложная комбинация переменных-флагов и условных операторов. И все это только для того, чтобы закончить выполнение внешнего цикла из внутреннего! Одна ко данную задачу можно решить значительно проще. Судите сами:

OUTER: $i++) { for($j=0;

$j<100;

$j++) { if ($i * 140) { print "Произведение $i и $j равно 140\n";

last OUTER;

Теперь оператору last явно указан цикл, из которого нужно выйти, это цикл, помеченный как В результате данная программа напечатает только первую пару найденных ею множителей, произведение которых равно 140.

Выход из Perl Оператор exit — одно из радикальных средств управления программой. Как только Perl встречает этот оператор, программа перестает выполняться и управление возвра щается операционной системе вместе со специальным кодом завершения. Значение этого кода определяет, успешно была завершена программа или нет. Более подробно коды завершения будут рассмотрены на занятии, "Взаимодействие с операцион ной системой". А пока достаточно знать, что код 0 означает, что все в порядке. Вот пример использования оператора exit:

60 Часть I. Основы Perl if eq { print работы программы.\п' exit 0;

Оператор exit обладает важным побочным действием, относящимся к действиям операционной системы. После его выполнения все открытые программой файлы закрываются, освобождается выделенная память и интерпретатор кор ректно завершает свою работу.

Упражнение по нахождению простых чисел Какой же учебник по программированию обходится без подобного упражнения? В этом упражнении мы рассмотрим небольшую программу, которая находит и распеча тывает простые числа. Как известно, простое число делится только на 1 и на само се бя, например: число 2 простое, 3 — простое, а 4 — составное (делится на 4 и 2).

Существует бесконечное множество простых чисел и их нахождение требует довольно большого количества вычислений.

Наберите в текстовом редакторе программу, приведенную в листинге 3.5, и сохра ните ее под именем primes. нумеруйте Сделайте файл выполняемым, сле дуя инструкциям, приведенным в конце 1-го занятия.

После этого попытайтесь запустить программу, набрав в командной строке:

perl primes Листинг Исходный код программы поиска простых чисел 1:

2:

3: t Необходимо найти только первые 20 простых 4:

5:

6: < $maxprimes) { 7:

$composite=0;

9: OUTER: for($i=2;

$i++) { 10: for{$j=$i;

$j<$value;

$j++) { 11: if { 13: last OUTER;

14: } > 16:

17: if (1 $composite) { 18:

19: print "Число $value простое\п";

20: } 21: } 3-й час. Управление процессом выполнения программы Проведем анализ программы.

• Строка 1. В этой строке указан путь к интерпретатору (измените его в соот ветствии с конфигурацией вашей системы) и ключ Всегда включайте ре жим выдачи предупреждений!

• Строка 3. Переменной присваивается максимальное количество целых чисел, которые нужно найти.

• 4. Переменная будет содержать значение, проверяемое на принадлежность к простым числам.

• Строка 5. В переменной хранится счетчик найденных простых чисел.

• Строка 6. Цикл while выполняется до тех пор, пока не будет найдено доста точное количество простых чисел.

• Строка 7. Значение переменной увеличивается так, начать проверку на принадлежность к простым числам с числа 2.

• Строка 8. Переменная $composite используется в цикле for как флажок. Она обозначает, что на текущей итерации исследуемое число не является про стым.

• Строки 9—10. Два вложенных цикла for перебирают все возможные множи тели числа Например, для числа 4 будут проверяться пары 2 и 2, 2 и 3, 3 и 3 и 3.

• Строки 11-14. Значения переменных $i и $j перемножаются. Если их про изведение равно $value, для этой переменной устанавливается флаг $composite и программа выходит из обоих циклов.

• Строки После циклов проверяется значение флага Если это проверенное число является простым. В рассматриваемых строках выводится соответствующее сообщение и увеличивается значение счетчика.

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

Резюме В этой главе вы познакомились со многими управляющими конструкциями Некоторые из них, в частности оператор if и логические операторы, предназначены для выполнения определенных фрагментов кода в зависимости от истинности или ложности соответствующих значений. Другие операторы, такие как while, until и for, позволяют циклически выполнять фрагменты кода необходимое количество раз. Так же вы узнали о логических значениях в Perl и их использовании во всех условных вы ражениях.

62 Часть I. Основы Perl Вопросы и ответы Мне приходилось программировать на С. Существуют ли в Perl аналоги операторов switch и case?

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

if == $звачевве1) { } elseif == $звачевие2) { оператор2;

} else { опера > Страница руководства по синтаксису языка Perl, доступ к которой можно полу чить, набрав в командной строке perdoc perlsyn, содержит большое количество удач ных примеров эмуляции оператора switch, некоторые из них имеют switch-подобный синтаксис.

Какое максимальное количество вложенных циклов for и while, а также операторов if допустимо?

Столько, сколько хотите, лишь бы хватило оперативной памяти. Обычно большое количество вложенных циклов означает, что вы выбрали неправильный подход к ре шению поставленной задачи.

Что мне делать? Perl выдает сообщение о том, что в программе отсутствует правая закрывающая фигурная скобка Unmatched right bracket (или Hissing right bracket).

При этом номер строки с ошибкой соответствует концу файла.

Это означает, что в программе есть открывающая скобка { без парной ей закры вающей } или наоборот. Иногда Perl может угадать, где пропущена скобка, а ино гда — нет. При глубоком вложении управляющих структур Perl не может найти ошибки, пока не будет проанализирован весь текст программы до конца файла. Хо рошие программные редакторы (например vi, или имеют средства, помогающие легко устранить несоответствие скобок. Воспользуйтесь ими.

Семинар Контрольные вопросы 1. Оператор while выполняет цикл, пока условие истинно. Какой оператор выполняет цикл, пока условие ложно?

if (not...) {} б) while (! условие) {} 2. Истинно или ложно следующее выражение?

(О and 5) || (( or 0 or "") and (6 and or 3-й час. Управление процессом выполнения программы а) истинно;

б) 3. Какое значение будет иметь переменная $i после окончания цикла?

for $i++) { } a) 10;

в) П.

Ответы 1. Правильным ответом будет вариант б). Цикл while (! условие) {} выполня ется, пока условие ложно.

2. Правильный ответ — вариант а). Действия по упрощению этого выражения:

(Ложь) || ((Ложь) and or Истина Ложь || Ложь or Истина Истина 3. Правильным является вариант в). Проверочное условие поэтому, когда оно не выполняется, $i должно быть равно 11. Если вы ошиблись, не переживайте. Это довольно распространенная ошибка, имеющая у про граммистов специальное название, — ошибка на единицу, или ошибка гра ничного условия.

Упражнения Модифицируйте программу, приведенную в листинге 3.1, чтобы игра про должалась, пока число не будет угадано.

Программа, приведенная в листинге 3.5, неэффективна. Например, она ана лизирует четные числа больше 2, хотя очевидно, что они не могут быть про стыми. Усовершенствуйте алгоритм поиска простых чисел.

64 Часть I. Основы Perl 4-й час Укладка строительных блоков: списки и массивы Скаляры Perl — существительные в единственном числе. Они могут представлять только один объект — слово, запись, документ, строку текста или символ. Однако иногда требуется оперировать целыми коллекциями объектов — набором слов, сово купностью записей, несколькими документами, 50 строками текста или десятками Множества объектов в Perl реализованы с помощью списков данных. Списки дан ных могут быть представлены тремя способами: с использованием простых списков, массивов и ассоциативных массивов.

Списки являются простейшей формой представления множества данных, по сути — это просто группа скаляров. Список представляет собой последовательность имен скаляров, разделенных запятыми. Вся последовательность заключена в круглые скоб ки. Например (2, $а, "Bob") — список, состоящий из двух чисел, переменной $а и слова Каждый отдельный скаляр называется элементом списка. Как и следовало ожидать, списки могут содержать произвольное количество элементов. Поскольку списки представляют собой коллекции скаляров, а скаляры также могут быть сколь угодно велики, то и списки могут быть довольно внушительных размеров.

Для хранения списка в виде переменной используется массив. Имена переменных массивов в Perl подчиняются тем же правилам, что и имена остальных переменных, но начинаются с символа Например, допустимое имя переменной-массива в Perl. Имена скаляров и массивов могут совпадать, например и совер шенно различные переменные. Первая обозначает скаляр, а вторая — массив. Они вообще могут не иметь никакого отношения друг к другу.

Индивидуальные скаляры, входящие в массив, называются элементами массива. На элементы массива можно ссылаться с помощью их положения в массиве — так назы ваемого индекса (например, можно сослаться на третий элемент массива пятый элемент массива и т. д.).

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

4-й час. Укладка строительных блоков: списки и массивы • Как заполнить пустой массив.

• Как поэлементно проверить массив.

• Как отсортировать и распечатать массив.

• Как преобразовать скаляры в массивы и как выполнить обратное преобразо вание.

Помещение скаляров в список или массив Создать список литералов очень просто — достаточно заключить в скобки набор скалярных значений. Например:

(5, 'яблоко', $х, 3.14159) В этом примере создается четырехэлементный список, содержащий число 5, слово 'яблоко', скалярную переменную $х и число я. Если список должен состоять только из обычных строк, можно обойтись без кавычек, для этого в Perl имеется оператор ( яблоки апельсины 45.6 $х ) Здесь создается четырехэлементный список. Каждый элемент может быть отделен от соседних символом пробела, табуляторами или символом перевода строки. Обрати те внимание, что $х является литералом, т.е. строкой '$х', а не переменной $х, вместо которой подставляется ее значение. Если элементы списка должны содержать пробе лы, то оператор использовать нельзя. Вместо него нужно использовать такую кон струкцию:

('яблоки', 'апельсины', '45.6', '$х') Обратите внимание, что литерал $х заключен в одинарные кавычки. Оператор qw не выполняет интерпретацию элементов списка, похожих на имена переменных, он воспринимает Их буквально. Таким образом, '$х' не заменяется значением перемен ной $х, а оставляется в первоначальном виде.

В имеется полезный оператор для работы со списками литералов — оператор диапазона. Оператор диапазона выглядит как пара точек (..). Ниже приведен пример использования этого оператора:

Оператор диапазона создает список, состоящий из всех целых чисел диапазона, за данного его левым и правым операндами (в нашем примере список будет состоять из целых чисел от 1 до 10 включительно). Если в списке должны быть представлены не сколько диапазонов — используйте несколько операторов:

(1.-10, 20..30);

В этом примере создается список из 21 элемента: целые числа от 1 до 10 и от 20 до 30 включительно. Если правый операнд оператора диапазона меньше, чем левый, как в создается пустой список.

Оператор диапазона можно применять не только к числам, но и к строкам. Диапа зон (a..z) создает список, состоящий из 26 строчных букв. Диапазон (aa..zz) создает куда более длинный список, состоящий из 675 буквенных пар, начинающийся с ab, ad и zx, zy, 66 Часть I. Основы Perl Массивы Списки литералов обычно используются для инициализации некоторых других структур, таких как массив или хэши. Для того чтобы создать в Perl массив, достаточ но что-нибудь поместить в В отличие от других языков программирования, мас сив не нужно заранее объявлять и указывать его размерность. Создать новый массив и поместить в него элементы можно следующим образом:

{ Гриша Петя Борис );

В этом примере инициализации массива используется оператор присваивания. Сле дует отметить, что оператор = применяется для присваивания значения как скалярам, так и массивам. После выполнения этого кода массив будет содержать три элемен та: Гриша, Петя и Борис. Обратите внимание на использование оператора qw, избавляю щего от необходимости набирать шесть кавычек и две запятые. В присваивании значе ния элементам массива могут участвовать другие массивы и даже пустые списки:

В этом примере все элементы массива копируются в новый массив Если содержал элементы, они будут потеряны. Второй оператор очищает массив Присваивание переменной пустого списка или пустого массива удаляет все ее элементы.

Если список литералов содержит другие списки, массивы или хэши, эти списки сводятся в один список, например:

( Петя Борис );

Наша Юля Света );

'Катя'), Список преобразуется в один простой список имен всех детей (Гриша, Петя и т.д.) перед тем, как его значения присваиваются переменной В следующей строке кода массив Skids и список ('Миша', 'Катя') сводятся в один длин ный список, затем этот список присваивается переменной Первоначальные структуры и ('Миша', 'Катя') не будут представлены в окончатель ном списке там лишь находятся их элементы, такие как Миша и Катя. Это оз начает, что предыдущий пример создания массива эквивалентен такому опе ратору присваивания:

Петя Борис Наша Юля Света Миша Катя Аписа);

Если слева от оператора присваивания находится список имен переменных, эти переменные инициализируются элементами списка. Рассмотрим пример:

($а, $b, $c) = апельсины бананы);

Здесь переменная инициализируется значением 'яблоки', — 'апельсины' и $с — 'бананы'. Если в списке слева содержится массив, этот массив "забирает" все возможные значения из правого списка. Например:

манго виноград вишня);

4-й Укладка строительных блоков: списки и массивы В этом примере переменной $а присваивается значение 'персики'. Остальные фрукты из правого списка присваиваются массиву Переменной $с не достается значения, так как все значения "вобрал" в себя массив Переменная $с стано вится неопределенной (undef).

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

Вот пример:

не используется куропатка дрозд кардинал перепелка присваивается белка дятел суслик В первой строке переменным $t, $u и $v присваиваются значения списка, нахо дящегося в правой части оператора присваивания. Избыточный элемент правой части ('перепелка') попросту не используется в выражении. Во второй строке переменным $а, $Ь и $с присваиваются значения из списка, находящегося в правой части операто ра присваивания, а переменной $d значения "не хватило" (последний элемент присваивается переменной $с). Следовательно, значение $d становится неоп ределенным (undef).

Доступ к элементам массива Выше была описана методика работы с массивами и списками. Теперь рассмотрим вопрос доступа к их индивидуальным элементам. Такой доступ необходим для выпол нения поиска элементов в массивах, изменения их значения, а также для добавления и удаления элементов.

Простейший способ получить доступ к содержимому всего массива — использовать имя в двойных кавычках:

print В этом примере будут распечатаны все элементы массива разделенные про белами.

Доступ к индивидуальным элементам массива осуществляется посредством их ин дексов. Индекс элементов массива начинается с 0 и с каждым элементом увеличива ется на 1. Каждому элементу массива соответствует свое значение индекса, например:

О Клен Кедр Ясень Количество элементов массива ограничено лишь количеством доступной опера тивной памяти. Для доступа к определенному элементу используется синтаксис Массив не обязательно должен существовать при обращении к его элементам. При необходимости массив создается автоматически. Ниже приведено несколько примеров работы с отдельными элементами массива:

Часть I. Основы Perl Дуб Кедр Клен Ясень );

print f "Дуб" print Печатает "Ясень".

$trees[4]='C0CHa';

Как видите, когда речь идет об индивидуальных элементах массива в их на звании используется символ $. Но ведь этот символ используется для обозначения скаляров, скажете вы. Символ $ в конструкции $trees[3] говорит о том, что это от дельный скаляр, находящийся в массиве Скаляры потому и обозначаются сим волом доллара, что содержат только одно значение. Это важный момент.

В начале этого занятия вы узнали, что скаляры и массивы могут иметь одинаковые имена, но при этом не быть связанными с другом. Perl усматривает разницу ме жду скаляром Strees и элементом массива номер которого задается в квад ратных скобках. Он понимает, что речь идет о первом элементе массива а во все не о скалярной переменной $trees.

может оперировать с подгруппой внутри массива, называемой сечением (slice).

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

дуб Кедр Клен Яблоня Вишня Сосна Персик Ель );

Фруктовые деревья I Хвойные деревья Определение размера массива Часто требуется определить размер массива, или индекс его последнего элемента.

Подобная задача возникает при добавлении или удалении элементов массива. В Perl для решения этой задачи предусмотрено несколько способов. Первый — использова ние специальной переменной Она возвращает последний допустимый индекс массива, например:

Дуб Кедр Клен Ябловя Вишня Сосна Перснк Ель );

print В этом массиве восемь элементов, но, так как нумерация массивов начинается с нуля, печатается индекс 7. Изменение значения переменной изменяет длину массива. Уменьшение значения приводит к удалению элементов с большими индек сами, а увеличение — добавляет в массив новые элементы. Новые элементы имеют неопределенное значение Другой способ нахождения размера массива — использование имени массива в скалярном контексте (т.е. там, где в выражении ожидается скаляр), например:

Переменная $size теперь содержит количество элементов массива На этом примере мы продемонстрировали, как используется концепция контекста в Perl. О контексте мы поговорим в следующем разделе.

работе с массивами можно также использовать отрицательные индексы, котрые соответствуют элементам, расположенным с конца массива. Например, последний элемент массива следующий с конца и т.д.

4-й час. Укладка строительных блоков: списки и массивы Подробнее о контексте Что же такое контекст? Контекст — это некое окружение элемента, помогающее понять, что он собой представляет. Если мы видим человека в одежде хирурга в боль — скорее всего, он врач, а на бале-маскараде — один из гостей.

Люди используют Контекст для определения смысла слов. Например, слово угол мо жет иметь несколько значений, в зависимости от окружающих его слов, или контекста:

• магазин за углом;

• прямой угол;

• снять угол.

Одно и то же слово, а значения разные. Значение слова зависит от окружающих его слов.

Точно так же и реагирует на контекст. Функции и операторы Perl ведут себя по-разному в зависимости от контекста. Два наиболее важных контекста Perl — это контекст списка и контекст. Например, оператор присваивания (символ =) можно применять и к массивам, и к скалярам. Тип выражения, находящегося слева (список или скаляр), определяет контекст выражения, находящегося справа. Посмот рите на этот фрагмент кода:

$a=$b;

Слева скаляр, контекст скалярный.

Слева массив, контекст списка.

t Слева список, опять контекст списка.

Слева скаляр, скалярный контекст.

Последняя строка представляет особый интерес, потому что массивы в скалярном контексте возвращают количество элементов массива.

Сравните, как используются переменные $а и в следующих строках кода (обратите внимание, оба оператора присваивания делают практически одно и то же):

Вода Пепси Кола Лимонад );

$b=$|foo;

print print После выполнения этого кода переменная $а имеет значение 4, а — 3. Почему так происходит? Массив в скалярном контексте возвращает количество своих элементов, которое присваивается переменной $а. А переменной $Ь присваивается значение индекса последнего элемента (не забывайте, что нумерация индекса массива начинается с нуля).

Учитывая, что массив в скалярном контексте возвращает количество своих элемен тов, легко проверить, пустой массив или нет:

Овес Рожь Ячмень );

if { print "В массиве есть } Здесь массив используется в скалярном контексте, в результате выражение возвращает количество элементов массива, в нашем случае — 4. Условное выражение в операторе if равно 4, а значит, оно истинно и тело блока выполняется.

70 Часть I. Основы Perl На самом деле массив здесь использован в специальном контексте, на зываемом булевым, или логическим. Это разновидность скалярного контекста со схожим действием. Булев контекст имеет место, когда Perl ожидает получить ло гическое значение, например в условном выражении оператора if. Еще одна разновидность контекста, называемая пустым контекстом (void), будет рас смотрена на 9-м занятии, "Дополнительные функции и операторы".

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

Функция print ожидает в качестве аргумента список. Неважно, в каком контексте формируется этот список. Поэтому функция print с массивом переданным в ка честве аргумента, распечатывает элементы этого массива, находящегося в контексте списка:

print Для навязывания скалярного контекста можно использовать псевдофункцию scalar:

print Здесь печатается количество элементов массива Функция scalar определяет скалярный контекст для ifoo, поэтому массив возвращает количество своих элемен тов, выводимое впоследствии функцией print.

Рассмотренной нами на 2-м занятии, "Строительные блоки Perl: числа и строки", функции chomp может быть передан в качестве аргумента как скаляр, так и массив. В скалярном аргументе удаляется завершающий символ-разделитель записей. Если ар гументом является массив, символ-разделитель удаляется в конце каждого скалярного элемента.

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

Скалярный контекст, в переменную $а помещается одна строка.

Контекст списка, все введенные строки помещаются в Контекст списка, все введенные строки помещаются в список.

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

Pages:     || 2 | 3 | 4 | 5 |   ...   | 7 |



© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.