Уважаемая редакция! Посылаю вам оглавление книги "Введение в Пел", аннотацию и одну главу "Синтаксис". Заранее прошу извинить за грамматические ошибки. В окончательном варианте их конечно не будет. В случае положительного решения вопроса с изданием данной книги убедительно прошу информировать меня по E-mail: root@klgtts.kaluga.su или phone: (08422)-4-91-87. С уважением, Владимир Маслов. --------------------------------------------------------------------- Аннотация В книге приводятся начальные сведения по новому языку программирования Пел. Данный язык получил широкое распространение в связи с развитием компьютерной сети Интернет. Все примеры в книге проверены для Пел версии 5.003 операционной системы Unix FreeBSD 2.1.0. Для программистов, системных администраторов и пользователей компьютеров. (C) Маслов Владимир Викторович. ---------------------------------------------------------------------- СОДЕРЖАНИЕ. 1. Аннотация. 2. От простого к сложному. 3. Запуск Пел - программы 4. Синтаксис 1. Декларации (объявления). 2. Простое предложение. 3. Сложные предложения. 4. Циклы. 1. while 2. Операторы управления циклом. 1. next 2. last 3. redo 3. for 4. foreach 5. Блоки и оператор switch. 6. Оператор goto. 7. POD операторы. Документирование программ. 5. Переменные 1. Контекст. 2. Скалярные значения. 3. Конструкторы скаляров. 4. Конструкторы списков. 5. Тип typeglobs 6. Встроенные переменные 7. Регулярные выражения (шаблоны) 8. Операторы и приоритеты 1. Термы и левосторонние списковые операторы. 2. Унарные операторы. 3. Операторы "привязки" =~ и != . 4. Мультипликативные операторы. 5. Аддитивные операторы. 6. Операторы сдвига. 7. Именованные унарные операторы. 8. Операторы отношений. 9. Операторы равенства. 10. Операторы работы с битами. 11. Логические операторы && (AND) и || (OR). 12. Оператор диаппазона '..' 13. Условный оператор '?:' 14. Операторы присваивания. 15. Оператор ',' (запятая) 16. Логические not, and, or, xor 17. Операторы ограничители строк. 18. Операторы ввода-вывода. 19. Слияние констант. 20. Целочисленная арифметика. 9. Встроенные функции 10. Подпрограммы 1. Private переменные. 2. Переменные типа local. 3. Прототипы (prototypes). 4. Ссылка как параметр. 5. Переопределение встроенных функций. 6. Автозагрузка. 11. Модули 1. Таблицы имен. 2. Конструкторы и деструкторы. 3. Классы. 4. Создание библиотеки. 5. Pragma библиотеки. 6. Стандартные библиотеки. 7. CPAN 12. Форматы отчетов 13. Отладка 14. Список литературы. 15. Интернет - ссылки. -------------------------------------------------------------------- Синтаксис. Пел программа (скрипт) состоит из последовательности деклараций и предложений. Единственно что должно быть обязательно декларировано это форматы отчетов и подпрограммы (функции). Все не объявленные переменные, массивы, имеют значение 0 или null. Декларации (объявления). Пел имеет свободный формат. Комментарии начинаются с символа '#' и продолжаются до конца строки. Декларации могут использоваться в любом месте программы так же как и предложения (statements) но действуют они только в фазе компиляции программы. Обычно их помещают или в начале или в конце программы. Декларация подпрограмм позволяет использовать имя подпрограммы как списковый оператор начиная с момента декларирования. Пример: sub test; # Декларация подпрограммы test $var1 = test $0; # Использование как оператора списка. Декларации подпрограмм могут быть загружены из отдельного файла предложением require или загружено и импортировано в текущую область имен предложением use. Подробно см. главу Модули. Простое предложение. Простое предложение обязательно заканчивается символом ';' если только это не последнее предложение в блоке где ';' можно опустить. Заметьте что существуют операторы такие как eval{} и do{} которые выглядят как сложные предложения но на самом деле это термы и требуют обязательного указания конца предложения. Любое простое предложение может содержать single модификатор перед ';'. Существуют следующие single модификаторы: if EXPR unless EXPR while EXPR until EXPR где EXPR - выражение возвращающее логическое значение true или false. Модификаторы while и until вычисляются в начале предложения кроме блока do который выполняется первым. if EXPR - Модификатор "если". Предложение выполняется если EXPR возвращает true. Пример: $var = 1; $var2 = 3 if $var > 0; # Результат: $var2 = 3 while EXPR - Модификатор "пока". Предложение выполняется столько раз пока EXPR = true Пример: $var = 1; print $var++ while $var < 5; # Печать $var с инкрементом Результат: 1234 until EXPR - Модификатор "до ". Предложение выполняется до тех пор пока EXPR = false Пример: $var = 1; print $var++ until $var > 5; # Печать $var с инкрементом Результат: 12345 unless EXPR - Модификатор "если не" . Обратный к if. Выражение выполняется есле EXPR = false. Пример: $var = 1; print $var++ unless $var > 5; # Печать $var с инкрементом Результат: 1 Сложные предложения. Последовательность простых предложений ограниченная функциональными ограничителями называется блоком. В Пел это может быть целый файл, последовательность предложений в операторе eval{} или чаще всего это множество простых предложений ограниченных круглыми скобками '{}'. Сужествуют следующие виды сложных предложений: if (EXPR) BLOCK if (EXPR) BLOCK else BLOCK if (EXPR) BLOCK elsif (EXPR) BLOCK ... else BLOCK LABEL while (EXPR) BLOCK LABEL while (EXPR) BLOCK continue BLOCK LABEL for (EXPR; EXPR; EXPR) BLOCK LABEL foreach VAR (LIST) BLOCK LABEL BLOCK continue BLOCK Обратите внимание, что сложные предложения описаны в термах блоков а не предложений как в языках C или Pascal. Поэтому необходимо всегда использовать круглые скобки для обозначения блока. if (EXPR) BLOCK - Вычисляется логическое выражение EXPR и если true блок выполняется. Пример: $var =1; if ($var == 1) { print $var,"\n"; } Результат: 1 if (EXPR) BLOCK else BLOCK2 - Если EXPR=true выполняется BLOCK иначе BLOCK2. Пример: $var =2; if ($var == 1) { print "\$var = 1\n"; } else { print "\$var не равно 1\n"; } Результат: $var не равно 1 if (EXPR1) BLOCK1 elsif (EXPR2) BLOCK2 ... else BLOCK - Если EXPR1=true выполняется BLOCK1 иначе если EXPR2=true выполняется BLOCK2 иначе ... иначе BLOCK. Пример: $var = 1; if ($var == 0) { print "\$var = 0\n"; } elsif ($var == 1) { print "\$var = 1\n"; } else { print "Не известное \$var\n"; } Результат: $var = 1 Цикл while выполняет BLOCK до тех пор пока EXPR = true. Метка LABEL не обязательна и состоит из идентификатора завершающегося символом ':'. Метка необходима при использовании внутри блока цикла управляющих операторов next, last и redo. Если метка все же отсутсвует то эти операторы ссылаются к началу ближайшего цикла. Блок после continue выполняется всегда перед тем как вычисляется логическое выражение EXPR. Это подобно EXPR3 в предлжении for поэтому в этом блоке удобно изменять счетчики и флаги цикла даже если применяестя оператор next. Операторы управления циклом. next - подобен continue в С. Переходит к началу текущего цикла т.е. повторяет итерацию. Пример: M1: while ($i < 6) { ++$i; # Увеличиваем счетчик на 1 next M1 if $i < 3; # Переходим в начало если $i < 3 ++$i; # иначе увеличиваем счетчик еще раз на 1 } continue { print "$i "; # Печатаем $i } Результат: 1 2 4 6 last - подобен оператору break в языке С. Немедленно прерывает цикл. Блок continue пропускается. Пример: M1: while ($i < 6) { ++$i; # Увеличиваем счетчик на 1 last M1 if $i > 3; # Выход из цикла если $i > 3 ++$i; # иначе увеличиваем счетчик еще раз на 1 } continue { print "$i "; # Печатаем $i } Результат: 2 4 redo - начать новый цикл не вычисляя EXPR и не выполняя continue блок. Пример: M1: while ($i < 6) { ++$i; # Увеличиваем счетчик на 1 redo M1 if $i == 3; # Далее пропустить для $i = 3 ++$i; # иначе увеличиваем счетчик еще раз на 1 } continue { print "$i "; # Печатаем $i } Результат: 2 5 7 Цикл for. LABEL for (EXPR1; EXPR2; EXPR3) BLOCK Оператор for полностью аналогичен оператору for в С. В перед началом цикла выполняется EXPR1, если EXPR2 = true выполняется блок, затем выполняется EXPR3. Пример: for ($i = 2; $i < 5; ++$i) { print $i, " "; } print "\nПосле цикла i = $i\n"; Результат: 2 3 4 После цикла i = 5 Цикл foreach. LABEL foreach VAR (LIST) BLOCK Переменной VAR присваивается поочередно каждый элемент списка LIST и выполняется блок. Если VAR опущенно то элементы присваиваются встроеной переменной $_. Если в теле блока изменять значение VAR то это вызовет изменение и элементов списка т.к. VAR фактически указывает на текущий элемент списка. Вместо слова foreach можно писать просто for - это слова синонимы. Пример: @месяц = ("январь","февраль","март"); # Создали массив foreach $i (@месяц) { print $i," "; # Печать $i } Результат: январь февраль март Пример: @месяц = ("январь","февраль","март"); # Создали массив foreach $i (@месяц) { $i = uc($i); # Перевели в верхний регистр } print @месяц; Результат: ЯНВАРЬФЕВРАЛЬМАРТ Пример: for $i (3,5,7) { print "$i "; } Результат: 3 5 7 Блоки и оператор switch. Блок не зависимо от того имеет он метку или нет семантически представляет собой цикл который выполняется один раз. Поэтому действие опраторов цикла next, last, redo - аналогично описанному выше. Блоки удобны для построения switch (переключатель) структур. В пел нет специального оператора switch подобного языку С поэтому вы сами можете создавать удобные для вас конструкции. Опыт автора показывает что для простоты написания лучше всего подходит конструкция вида if ... elsif ... else ... хотя можно сочинить и нечто подобное: SWITCH: { if ($i ==1 ) { .....; last SWITCH; } if ($i ==2 ) { .....; last SWITCH; } if ($i ==3 ) { .....; last SWITCH; } $default = 13; } Выбирайте сами по своему вкусу. Оператор goto. В Пел существует оператор goto хотя где , как и когда его применять как говорил Ходжа Насредин "Тонкий филосовский вопрос". Для начинающих программистов которым от так "нужен" я бы вообще посоветовал "забыть" о его существовании. Однако при создании больших производственных задач на последнем этапе особенно при отработке "отвальных" ошибочных ситуаций конечно goto нужен. В Пел реализовано три формы goto. goto - метка, goto - выражение и goto - подпрограмма. goto - метка выполняет непосредственный переход на указанную метку. goto - выражение - Вычисляет имя метки и делает соответсвующий переход. Например если мы хотим сделать переход на одну из трех меток "M1:", "M2:" или "M3:" в зависимости от значений переменной $i равной 0, 1 или 2 то это лучше сделать следующим образом: goto ("M1", "M2", "M3")[$i]; здесь $i используется как индекс массива указанного непосредственно в выражении. goto подпрограмма - довольно редкий случай т.к. всегда проще и надежней вызвать подпрограмму "естественным" образом. POD операторы. Документирование программ. В Пел реализован очень удобный механизм для написания документации в момент создания программы. Для этого применяются специальные POD операторы. Если в теле программы интерпретатор встречает оператор начинающийся с символа '=' например: = head Набор стандартных процедур то пропускается все до слова '=cut'. Это удобно для включения длинных на несколько строк или страниц комментариев. Затем с помощью специальной программы pod можно отделить текст документации от текста программы.