).
Чтобы можно было передать скрипту данные, введенные в форме, необходимо наличие кнопки "submit".
При нажатии на эту кнопку отсылаются данные только той формы, в которой эта кнопка находится.
Передать данные из разных форм средствами HTML нельзя.
Форма может содержать неограниченное кол-во элементов или не содержать их вовсе.
Параметры формы
Тэг
Оператор Print хеши
Урок 12. Оператор Print, хеши.
Хэш - ассоциативный массив, доступ к данным осуществляется при помощи ключа, ассоциированного со значением. Описание хеша начинается с символа "%" (процент).
Т.к. ключей и значений должно быть одинаковое количество (иначе какой-нибудь ключ ни с чем не проассоциируется или одно из значений останется лишним), массив с четным количеством элементов можно преобразовать в хеш. Верно и обратное. В хеше не должно быть одинаковых ключей. Также ключи не могут иметь значение "пустая строка". Однако это не справедливо для значений ключей.
Способы определения хеша
Способ 1:
%hash = ( 'шляпа' => 'серая', 'водка' => 'горькая', 'вобла' => 'вкусная' );
Способ 2:
%hash = (); $hash{'шляпа'} = 'серая'; $hash{'водка'} = 'горькая'; $hash{'вобла'} = 'вкусная';
С одним из системных хешей Вы уже знакомы, это хеш %ENV. Приведенная ниже программа демонстрирует все значения этого хеша.
#!/usr/bin/perl #programm 12 print "Content-Type: text/html\n\n";
$flag=1; @array=%ENV; print "\n"; foreach $i(@array){ if($flag==1){$flag=0; print "| $i | "; }else{$flag=1; print "$i |
\n" }} print "
";
Т.к. этот курс не подразумевает глубокое изучение хешей, на приведенном выше материале мы и остановимся. Материал по более детальному изучению можно найти в приложении.
Функции работы с файлами
Урок 13. Функции работы с файлами
Собственно, начиная с этого урока мы будем изучать встроенные в Perl функции (до этого мы изучали операторы), и начнем с функций, которые позволяют нам работать с файлами.
Дескриптор файла
Дескриптор файла в Perl-программе — это имя соединения для ввода-вывода между вашим Perl-процессом и внешним миром. Имена дескрипторов файлов похожи на имена помеченных блоков, но они берутся из другого пространства имен (поэтому у вас может быть скаляр $fred, массив $fred, хеш %fred, метка fred, а теперь и дескриптор файла fred). Как и метки блоков, дескрипторы файлов используются без специального префиксного символа, поэтому их можно спутать с существующими или возможными в будущем зарезервированными словами (для команд, подпрограмм и др.). Рекомендую составлять дескрипторы файлов только из прописных букв. Во-первых, они будут хорошо выделяться в тексте программы, и, во-вторых, благодаря этому программа не даст сбой при введении нового зарезервированного слова.
Функции для работы с файлами (продолжение)
Урок 14. Функции для работы с файлами (продолжение)
Оператор "-X"
Проверка файла, где 'X' - одно из ниже описанных значений. Это унарный оператор с одним аргументом - либо именем файла, либо указателем файла. Проверяет одно из условий. Если аргумент не указан, то берется значение переменной $_. Несмотря на странный вид, это унарный оператор с соответствующим приоритетом. Аргумент можно заключать в круглые скобки. 'X' имеет следующие значения:
| -r |
Файл разрешен на чтение эффективным uid/gid |
| -w |
на запись -//- |
| -x |
исполнение -//- |
| -o |
принадлежит эффективному uid (идентификатор пользователя) |
| -R |
Файл разрешен на чтение реальным uid/gid |
| -W |
на запись -//- |
| -X |
исполнение -//- |
| -O |
принадлежит реальному uid |
| -e |
файл существует |
| -z |
пустой |
| -s |
не пустой |
| -f |
обычный текст |
| -d |
директория |
| -l |
символическая ссылка |
| -p |
pipes (конвейер) |
| -S |
socket (гнездо) |
| -b |
специальное блочное устройство |
| -c |
-//- символьное -//- |
| -t |
указатель на уст-во tty |
| -u |
установлен бит setuid |
| -g |
-//- setgid |
| -k |
-//- sticky |
| -T |
текстовой файл |
| -B |
двоичный |
| -M |
"возраст" файла в днях на момент старта скрипта |
| -A |
дней с последнего чтения |
| -C |
дней с последней модификации inode |
Если проверяется условие, то возвращает True при истинном утверждении и False при ложном. Код ниже проверяет наличие файла "file.txt" в текущей директории и при его наличие выводит кол-во дней с момента последнего обращения к нему:
if (-e("file.txt")){print (-A("file.txt"))} else {print "Файл не создан"}
Функции для работы с файлами (продолжение)
Урок 15. Функции для работы с файлами (продолжение)
Подпрограммы прототипы
Урок 17. Подпрограммы, прототипы
Для применения подпрограммы ее необходимо определить либо в текущем модуле (файле), либо во внешнем модуле (файле). Подпрограммы определяются и декларируются следующим образом:
sub имя; - Только декларация. Определение ниже.
sub имя (прототипы); - То же но с декларацией параметров.
sub имя блок; - Декларация и определение.
sub имя (прототипы) блок; - То же, но с параметрами.
Все параметры передаются подпрограмме как массив @_. Соответственно $_[0] - первый параметр, $_[1] - второй и т.д. Массив @_ - локальный, но он содержит адреса параметров, поэтому можно изменять значение параметров. Возвращаемое значение подпрограммы - результат последнего оператора. Это может быть как скаляр так и массив. Можно принудительно возвращать результат используя функцию return().
Подпрограмму можно вызвать, используя префикс '&' перед именем подпрограммы. Если подпрограмма предварительно продекларирована, то префикс и скобки можно опустить.
Для применения переменных доступных только внутри блока или подпрограммы необходимо определить их с помощью функции my(список). Если переменная одна, то скобки можно опустить.
Для тех кто еще не понял о чем идет речь:
Процедуры и функции представляют собой важный инструмент Perl-а, позволяющий писать хорошо структурированные программы. В структурированных программах обычно легко прослеживается основной алгоритм, их нетрудно понять любому читателю, они проще в отладке и менее чувствительны к ошибкам программирования. Все эти свойства являются важной особенностью процедур (функций), каждая из которых представляет собой во многом самостоятельный фрагмент кода, связанный с основной программой лишь несколькими параметрами. Самостоятельность процедур дает возможность без особых изменений в основной программе изменять код процедуры.
Процедурой в Perl называют особым образом оформленный участок кода со своим собственным именем. Упоминание этого имени в программе приводит к активации процедуры. Сразу после активации процедуры начинают выполняться входящие в неё операторы. После выполнения последнего оператора, основная программа продолжает свое выполнение дальше.
Для обмена информацией между основной программой и процедурой используются параметры вызова. Для передачи информации от процедуры программе, внутри процедуры используется оператор return.
Работа с числами
Урок 18. Работа с числами
Функции для работы со строками
Урок 19. Функции для работы со строками
Типы данных в Perl переменные
Урок 2. Типы данных в Perl, переменные, одинарные и двойные кавычки
Perl - не типизированный язык программирования, в отличие от Pascal или C (хотя очень похож на последний). В Perl есть 3 основных типа переменных: скаляры, массивы и хеши (ассоциативные массивы). Сегодня подробно разберем первый из типов.
Perl не требует обязательного объявления переменных. Переменная автоматически определяется как только встретилась в контексте. Т.к. Perl не типизированный язык, для него нет таких понятий как строковая переменная, числовая, байтовая и т.д. Это отрадно!
В зависимости от контекста, её содержимое автоматически конвертируется в числовое или текстовое.
Помимо этого скаляр может иметь и логическое значение True или False (Истина или Ложь). Если скаляр НЕ равен 0 или пустой строке, он имеет логическое True. В противном случае - False.
Обычная скалярная переменная начинается со спец. символа $, её имя должно начинаться только с латинской буквы или символа нижнего подчеркивания. В состав имени переменной могут входить также и цифры. Регистр букв тоже важен. К примеру $Var1 и $var1 это разные переменные.
Для присваивания переменной какого-то значения, служит знак присваивания. Как и в Basic, это символ равенства: "=". Работает он также как и в остальных языках, по этому не требует описания.
Чтобы присвоить переменной текстовую строку, её заключают в кавычки. Perl допускает применение как одинарных ('), так и двойных (") кавычек. Разница лишь в том, что в двойных кавычках переменные интерполируются (подставляются значения переменных), а в одинарных - нет. Для присваивания переменным числовых значений кавычек не требуется.
* * * *
Теперь давайте вспомним предыдущий наш урок. Попробуем модернизировать нашу программу с учетом полученных сегодня знаний. Изначально она выглядела таким образом:
#!/usr/bin/perl
print "Content-Type: text/html\n\n";
print "Мир дому твоему!";
Присвоим строку "Мир дому твоему!" какой-нибудь переменной, и будем выводить её значение. Программа получится следующей:
#!/usr/bin/perl
#programm 1
print "Content-Type: text/html\n\n";
$message = "Мир дому твоему!";
print "$message";
Пока пользы от этого мало. Теперь напишем программу, которая демонстрирует работу одинарных и двойных кавычек.
#!/usr/bin/perl
#programm 2
print "Content-Type: text/html\n\n";
$var1 = 16;
$var2 = "$var1 овец";
print 'Значение переменной $var1: ';
print "$var1
";
print 'Значение переменной $var2: ';
print "$var2";
Небольшой комментарий. Сначала мы присваиваем число 16 переменной $var1. Как было сказано ранее, числа не нужно обрамлять кавычками.
Следующая строка требует объяснения. Т.к. кавычки у нас стоят двойные, переменные в них интерполируются. Таким образом переменной $var2 мы присваиваем строку "16 овец".
Далее выводим строку "Значение переменной $var1: ". Т.к. кавычки стояли одинарные, переменная не интерполируется.
Затем выводим значение переменной $var1 и добавляем HTML тег "
" для переноса текста на следующую строку. Далее ситуация повторяется.
* * * *
Ответьте на вопросы:
Какие символы может содержать название переменной? Когда обычная скалярная переменная имеет логическое "Ложь"? Какие из ниже приведенных переменных написаны неправильно или используются неправильно? Объясните, почему Вы так считаете?
$Var1="256"; $Var2="33.2"; $Var3='Var1, '; $_Var=some text here; $_var=some text here; $_var='some text here'; $-var="some text here";
|
|
Операторы для работы со строками (продолжение)
Урок 20. Операторы для работы со строками (продолжение)
Регулярные выражения
Урок 21. Регулярные выражения
Наш сегодняшний урок ЧЕРЕЗВЫЧАЙНО труден - будем изучать весьма специфическую и тяжелую для усвоения информацию. Но понять эту тему важно, ведь она - вся сила (Power) языка Perl.
И так, соберем все оставшиеся силы в кулак и приступим к поеданию гранита науки, немного уже осталось...
Совет: Прочитайте этот урок не спеша, пытаясь вдуматься буквально в каждое слово. С первого раза Вы, скорее всего, не поймете тему. По этому читайте её не менее 4-х раз с интервалом не менее 1 часа. Это поможет запомнить до 60% всей информации на уровне восприятия и до 30% на интуитивном уровне. Лучше всего держать всю эту страницу где-нибудь "под рукой" в распечатанном виде, чтобы в случае необходимости Вы смогли быстро найти нужную Вам информацию.
Не зацикливайтесь на том, что Вам не понятны примеры. Это естественно. Просто примите к сведению, что эти скрипты работают и не старайтесь разобраться в них. Сегодня Вы должны ознакомиться с темой только теоретически, практикой займемся немного позже.
Чаще всего в Perl регулярные выражения используются в операторах поиска и замены таких как s//, m/, операторах связки =~
или != и т.д. Как правило все эти операторы имеют схожие опции такие как:
| i |
- не различать строчные и заглавные буквы. |
| m |
- считать строку многострочной. |
| s |
- однострочная строка. |
| x |
- расширенный синтаксис ( использование пробелов и комментариев) |
Обычно все эти опции обозначают как '/x'. Их можно использовать даже внутри шаблонов, используя новую конструкцию (?...)
Регулярные выражения или шаблоны (pattern) то же самое, что и regexp процедуры в Unix. Выражения и синтаксис заимствованы из свободно распространяемых процедур V8 Генри Спенсера (Henry Spencer), там же они подробно и описаны.
В шаблонах используются следующие метасимволы (символы обозначающие группы других символов) часто называемые egrep - стандартом:
| \ |
- считать следующий метасимвол как обычный символ. |
| ^ |
- начало строки |
| . |
- один произвольный символ. Кроме '\n' - конец строки. |
| $ |
- конец строки |
| | |
- альтернатива (или) |
| () |
- группировка |
| [] |
- класс символов |
Метасимволы имеют модификаторы (пишутся после метасимвола):
| * |
- повторяется 0 или большее число раз |
| + |
- -//- 1 или большее число раз |
| ? |
- 1 или 0 раз |
| {n} |
- точно n раз |
| {n,} |
- по меньшей мере раз |
| {n,m} |
- не меньше n, но и не больше m |
Во все других случаях фигурные скобки считаются обычными (регулярными) символами. Таким образом '*' эквивалентна {0,} , '+' - {1,} и '?' - {0,1}. n и m не могут быть больше 65536.
По умолчанию действие метасимволов "жадно" (greedy). Совпадение распространяется столько раз, сколько возможно, не учитывая результат действия следующих метасимволов. Если вы хотите "уменьшить их аппетит", то используйте символ '?'. Это не изменяет значение метасимволов, просто уменьшает распространение. Таким образом:
| *? |
- станет 0 и более |
| +? |
- 1 и более |
| ?? |
- 0 или 1 раз |
| {n}? |
- точно n раз |
| {n,}? |
- не меньше n раз |
| {n,m}? |
- больше или равно n и меньше m раз |
Шаблоны работают так же, как и двойные кавычки, поэтому в них можно использовать `\` - символы (бэкслэш-символы):
| \t |
- символ табуляции |
| \n |
- новая строка |
| \r |
- перевод каретки |
| \а |
- перевод формата |
| \v |
- вертикальная табуляция |
| \a |
- звонок |
| \e |
- escape |
| \033 |
- восьмеричная запись символа |
| \x1A |
- шестнадцатеричная |
| \c[ |
- control символ |
| \l |
- нижний регистр следующего символа |
| \u |
- верхний регистр -//- |
| \L |
- все символы в нижнем регистре до \E |
| \U |
- в верхнем -//- |
| \E |
- ограничитель смены регистра |
| \Q |
- отмена действия как метасимвола |
Дополнительно в Perl добавлены следующие метасимволы:
| \w |
- алфавитно-цифровой или '_' символ |
| \W |
- не -//- |
| \s |
- один пробел |
| \S |
- один не пробел |
| \d |
- одна цифра |
| \D |
- одна не цифра |
Обратите внимание, что все это "один" символ. Для обозначения последовательности применяйте модификаторы. Так:
| \w+ |
- слово |
| \d+ |
- целое число |
| [+-]?\d+ |
- целое со знаком |
| [+-]?\d+\.?\d* |
- число с точкой |
Кроме того существуют мнимые метасимволы. Обозначающие не существующие символы в месте смены значения. Такие как:
| \b |
- граница слова |
| \B |
- не граница слова |
| \A |
- начало строки |
| \Z |
- конец строки |
| \G |
- конец действия m//g |
Граница слова (\b) - это мнимая точка между символами \w и \W. Внутри класса символов '\b' обозначает символ backspace (стирания). Метасимволы \A и \Z - аналогичны '^' и '$', но если начало строки '^' и конец строки '$' действуют для каждой строки в многострочной строке, то \A и \Z
обозначают начало и конец всей многострочной строки.
Если внутри шаблона применяется группировка (круглые скобки), то номер подстроки группы обозначается как '\цифра'. Заметьте, что за шаблоном в пределах выражения или блока эти группы обозначаются как '$цифра'. Кроме этого существуют дополнительные переменные:
| $+ |
- обозначает последнее совпадение |
| $& |
- все совпадение |
| $` |
- все до совпадения |
| $' |
- все после совпадения |
Пример:
$s = "Один 1 два 2 и три 3"; if ($s =~ /(\d+)\D+(\d+)/) { print "$1\n";# Результат '1' print "$2\n";# '2' print "$+\n";# '2' print "$&\n";# '1 два 2' print "$`\n";# 'Один ' print "$'\n";# ' и три 3' }
Perl версии 5 содержит дополнительные конструкции шаблонов:
| (?#комментарий) |
- комментарий в теле шаблона. |
| (?:шаблон) |
- группировка как и '( )', но без обратной ссылки |
| (?=шаблон) |
- "заглядывание" вперед. Например /\w+(?=\t)/ соответствует слову, за которым идет табуляция, но символ '\t' не включается в результат. |
Пример:
$s = "1+2-3*4"; if ($s =~ /(\d)(?=-)/) # Найти цифру за которой стоит '-' { print "$1\n"; # Результат '2' } else { print "ошибка поиска\n";}
(?!шаблон) - "заглядывание" вперед по отрицанию.
Пример:
$s = "1+2-3*4"; if ($s =~ /(\d)(?!\+)/) # Найти цифру за которой не стоит '+' { print "$1\n"; # Результат '2' } else { print "ошибка поиска\n";}
Правила регулярных выражений:
Любой символ обозначает себя самого, если это не метасимвол. Если вам нужно отменить действие метасимвола, то поставьте перед ним '\'.
Строка символов обозначает строку этих символов.
Множество возможных символов (класс) заключается в квадратные скобки '[]', это значит, что в данном месте может стоять один из указанных в скобках символов. Если первый символ в скобках это '^' - значит ни один из указанных символов не может стоять в данном месте выражения. Внутри класса можно употреблять символ '-', обозначающий диапазон символов. Например, a-z - один из малых букв латинского алфавита, 0-9 - цифра и т.д.
Все символы, включая специальные, можно обозначать с помощью '\' как в языке С.
Альтернативные последовательности разделяются символом '|' Заметьте что внутри квадратных скобок это обычный символ.
Внутри регулярного выражения можно указывать "подшаблоны" заключая их в круглые скобки и ссылаться на них как '\номер' Первая скобка обозначается как '\1'.
* * * *
|
|
Операторы поиска и замены
Урок 22. Операторы поиска и замены
Еще немного о циклах
Урок 23. Еще немного о циклах
Функции для работы с массивами
Урок 24. Функции для работы с массивами
Функции для работы с хешами
Урок 25. Функции для работы с хешами
Дата и время
Урок 26. Дата и время
Скорее всего эти функции Вам будут недоступны, если вы используете Windows95/98.
Функции для работы с директориями
Урок 27. Функции для работы с директориями
заключительный Прочие функции
Урок 28 заключительный. Прочие функции
Строго говоря, Вы уже овладели необходимыми навыками для написания собственных CGI-приложений. В этом уроке я расскажу Вам о тех немногочисленных функциях, которые, в редких случаях, позволяют упростить процесс программирования или просто существуют, но остались не затронутыми в наших уроках.
Операции с числами и строками логические выражения
Урок 3. Операции с числами и строками, логические выражения
В этом уроке я расскажу об операциях которые можно проводить с числами и строками. Со многими из них Вы уже встречались в других языках программирования. Начну я, пожалуй, с операциями над числами.
| ++ |
- инкремент |
$a ++; # $a = $a + 1 |
| -- |
- дикремент |
$a --; # $a = $a - 1 |
| ** |
- возведение в степень |
$a = 2**10; # $a = 1024 |
| * |
- умножение |
$a = 5 * 6; # $a = 30 |
| / |
- деление |
$a = 5 / 2; # $a = 2.5 |
| % |
- получение остатка от деления |
$a = 5 % 2; # $a = 1 |
| + |
- сложение |
$a = 5 + 5; # $a = 10 |
| - |
- вычитание |
$a = 2 - 5; # $a = -3 |
Приоритеты распределены в порядке убывания сверху вниз. Как видите, всё как в математике.
Операции над строками.
| . |
конкатенация |
$a = "abc"."123"; # $a = "abc123" |
Как видите, операторов работы со строками немного меньше ;-) .
Для удобства оперирования с одним операндом, придуман оператор "X=", где X может принимать значение любого из вышеперечисленного операторов. Как это работает: $a .= 5, тоже самое что и $a = $a . 5;
$u += 8, тоже самое что и $u = $u + 8 и т.д.
Логические операторы позволяют проверить на истинность некоторое условие или совокупность условий. Если условие истинно, оператор возвращает True, если ложно - False.
| < |
меньше |
$a = 5 < 2; # $a = False |
| > |
больше |
$a = 5 > 2; # $a = True |
| == |
равно |
$a = 3 == 3; # $a = True |
| <= |
меньше или равно |
$a = 4 <= 8; # $a = True |
| >= |
больше или равно |
$a = 4 >= 8; # $a = False |
| != |
не равно |
$a = 5 != 5; # $a = False |
| lt |
строковое меньше |
$a = "11" lt "a"; # $a = True |
| gt |
строковое больше |
$a = "11" gt "a"; # $a = False |
| eq |
строковое равно |
$a = "o" eq "o"; # $a = True |
| ne |
строковое не равно |
$a = "o" ne "o"; # $a = False |
| le |
строковое меньше или равно |
$a = "11" le "a"; # $a = True |
| ge |
строковое больше или равно |
$a = "11" ge "a"; # $a = False |
Таблицы истинности операторов AND, OR и XOR. В них показано что возвращает логический оператор в зависимости от значений сравниваемых выражений
| AND |
OR |
XOR |
| True |
True |
True |
True |
True |
True |
False |
True |
True |
| False |
False |
True |
True |
True |
Flase |
True |
True |
Flase |
| False |
True |
False |
True |
False |
True |
True |
False |
True |
| False |
False |
False |
False |
False |
False |
False |
False |
False |
* * * *
Программа, демонстрирующая работу условных операторов.
#!/usr/bin/perl #programm 3 print "Content-Type: text/html\n\n";
$var1 = 5; $var2 = 3; $a=(($var1 > $var2) and ($var1 != $var2)); print $a;
Работает она следующем образом: сначала вычисляются логические выражения в скобках, затем сравниваются между собой. Оба выражения истины. Из таблицы истинности видно: если оба выражения истины, логический оператор AND возвращает True, что и выведется нам на экран.
Несколько слов о преобразовании строк в числа и обратно.
Если строковое значение используется как операнд в операции с числами (например, в операции сложения), Perl автоматически преобразует эту строку в эквивалентное числовое значение, как если бы оно было введено в виде десятичного числа с плавающей запятой. Нечисловые окончания и начальные пробельные символы игнорируются, поэтому " 123. 4 5 fed" (с начальным пробелом) без какого-либо предупреждения преобразуется в "123. 45". Самый крайний из подобных случаев — когда нечто, не являющееся числом, вообще без предупреждения преобразуется в нуль (как строка fed, которую мы использовали здесь как число).
Если же, наоборот, там, где должно быть строковое значение, вводится числовое (например, в операции конкатенации строк), это числовое значение конвертируется в строку, которая была бы выведена на экран вместо него. Например, если вы хотите конкатенировать строку х с результатом умножения 4 на 5, это можно записать как
"X" .(4*5); # то же самое, что "X" . 20, или "Х20"
(Помните, что круглые скобки заставляют сначала выполнить 4*5, а затем выполнять операцию конкатенации.)
Другими словами, вам не нужно (в большинстве случаев) беспокоиться о том, что указано в качестве операнда — строка или число, поскольку Perl выполняет все необходимые преобразования самостоятельно.
* * * *
Попробуйте по памяти переписать таблицы истинности для каждого из операторов (AND, OR, XOR).
Напмшите программу, которая выводит значения 3-х переменных в четвертую таким образом, чтобы значение 3-й переменной стояло сразу за начением 2-й, а значение 2-й - за первым.
|
|
Составной и условный операторы
Урок 4. Составной и условный операторы
Блок операторов — это последовательность операторов, заключенная в парные фигурные скобки. Блок операторов выглядит следующим образом:
{ оператор 1; оператор 2; оператор 3; ..... оператор n; }
Perl выполняет операторы по очереди, начиная с первого и кончая последним.
Синтаксически блок операторов принимается вместо любого одиночного оператора, но обратное не верно. Точка с запятой после последнего оператора ставить не обязательно.
Условный оператор IF
IF (EXPR){operator} IF (EXPR){operator} else {operator1} IF (EXPR){operator} elsif (EXPR2){operator2} ... else{operator3} {operator} IF (EXPR)
Условный оператор позволяет проверять некоторое условие и в зависимости от результатов проверки выполнять то или иное действие. Таким образом, условный оператор - это средство позволяющее ветвись вычислительный процесс. Условный оператор работает по следующему алгоритму: Вначале вычисляется условное выражение EXPR. Если оно истинно, выполняется блок "operator" и программа выполняется дальше. Если EXPR ложное, проверяется условие EXPR2. Если оно истинное, выполняется блок "operator2" и программа выполняется дальше, иначе выполняется блок operator3. Примечание: проверяемых условий может быть сколько угодно. С помощью этого свойства оператора IF можно реализовывать многочисленное ветвление программы.
Оператор Unless
Unless имеет такой же синтаксис как и IF, но отличается от него тем, что блоки выполняются не при истинных значениях условий, а при ложных.
* * * *
Следующая программа демонстрирует работу оператора IF в сокращенной форме:
#!/usr/bin/perl #programm 4 print "Content-Type: text/html\n\n";
$var = 23; if ($var%2){$mess="не четное"}else{$mess="четное"} print "$var -$mess число";
Как работает оператор IF в этой программе:
Как Вы помнете, выражение принимает значение True если оно не равно 0 или пустой строке. Наличие остатка от деления на 2 является признаком его нечетности. Значит если есть остаток, выражение истинно, и выполняется первый блок. Если остатка нет, значение ложно и выполняется второй блок.
* * * *
Напишите программу, которая сообщает о состоянии воды при различных температурах (счисление по Кельвину). Температуру задайте в переменной $temperature. Сделайте проверки на непригодные значения (температура по K никогда не бывает отрицательной.)
Ответьте на вопросы:
Посчитается ли ошибкой, если после последнего оператора программы не стоит точка с запятой? О чем это говорит? Как продолжет свое выполнение программа, если ни одно из условий следующей конструкции не будет истинно: IF (EXPR){operator} elsif (EXPR2){operator2} ?
Перепишите программу 4, чтобы вместо оператора IF использовался оператор Unless.
Дополнительная информация: [Управляющие структуры ] [Управляющие структуры 2 ]
|
|
Операторы повторения с заданным количеством итераций
Урок 5. Операторы повторения с заданным количеством итераций
Операторы повторения (формирования циклов) служат для программирования циклически повторяющегося участка кода.
Оператор X
operator x (кол-во итераций);
x - оператор позволяющий выполнить строго заданное кол-во раз только один оператор.
Оператор FOR
for (EXPR1; EXPR2; EXPR3) {operator}
Работа оператора FOR в Perl аналогична работе его в C и JavaScript:
Сначала вычисляется выражение EXPR1. Оно содержит в себе переменную цикла. Затем вычисляется EXPR2. Если его значение True, выполняется блок операторов. Иначе цикл завершается и программа выполняется дальше. После выполнения блока операторов вычисляется выражение EXPR3, затем EXPR2. Если его значение True, выполняется блок операторов. Иначе цикл завершается. И так далее до того как EXPR2 не станет False.
* * * *
Простейшая программа, демонстрирующая работу оператора FOR.
#!/usr/bin/perl #programm 5 print "Content-Type: text/html\n\n";
for($i=0;$i
аргумент цикла читается следующем образом: "переменной $i присваиваем значение 0. Выполнять цикл пока $i меньше или равна 1000. Каждую итерацию $i инкрементировать". Эта программа вываливает на экран все числа начиная с 0 и заканчивая 1000.
Теперь поставим пере собой задачу вывести таблицу Пифагора в окно браузера. Диапазон чисел по оси X и Y совпадает и равен 2..9.
#!/usr/bin/perl #programm 6 print "Content-Type: text/html\n\n";
print ''; for($i=1;$i<=9;$i++){ for($u=1;$u<=9;$u++){ if(($u*$i)/10 < 1){print" "} unless($u*$i==1){print $u*$i}else{print" "} print " "; } print"
"; } print '';
Разберем как эта программа работает.
Выводим строку "". Этим мы выбираем тип шрифта, каким будут выводиться данные.
Начинаем новый цикл, в котором переменная $i изменяется от 1 до 9.
В него "вкладываем" еще один цикл, в котором переменная $u также изменяется от 1 до 9.
Проверяем условие: если произведение переменных циклов, деленных на 10 меньше единицы, выводим пустой символ (пробел), иначе ничего не делаем. Такая хитрая операция нужна для того чтобы все числа таблицы Пифагора имели одинаковые знакоместа. Это позволит построить правильно организованную таблицу.
Проверяем условие: если произведение переменных массивов не равно единице выводим их произведение, иначе выводим пустой символ. Эта операция нужна чтобы исключить единицу из наших осей таблицы.
Затем выводим пустой символ. Это нужно чтобы удалить столбцы таблицы друг от друга на один символ.
Когда внутренний цикл закончит выполняться, закончится и вывод первой строки. Выполнится вывод тэга переноса строки и внутренний цикл снова начнет выполняться но уже с другим значением переменной $i.
Когда внешний цикл отработает все 9 итераций, а внутренний 81-у итерацию, будет сделан вывод закрывающего тега font и программа успешно завершит свое выполнение, оставив на экране браузера так всеми ненавистную таблицу Пифагора.
* * * *
Модернизируйте программу таким образом, чтобы таблица Пифагора выводилась в виде HTML таблицы.
Реализуйте алгоритм закрашивания ячеек значений в шахматном порядке, а осей координат в один какой-нибудь цвет.
Как поведет себя цикл FOR, если в его теле изменять переменную цикла так, чтобы условия цикла всегда было истинно?
Дополнительная информация: [Управляющие структуры ] [Управляющие структуры 2 ]
|
|
Операторы повторения с
Урок 6. Операторы повторения с неизвестным заранее количеством итераций
Оператор WHILE
while (EXPR) {operator1} continue {operator2}
Цикл while выполняет operator1 до тех пор пока EXPR = true. Блок после continue выполняется всегда перед тем как вычисляется логическое выражение EXPR. Это подобно EXPR3 в предложении for, поэтому в этом блоке удобно изменять счетчики и флаги цикла.
Оператор Until
Этот оператор по синтаксису ничем не отличается от While, но работает пока EXPR = False.
Метки оператор перехода операторы управления циклами
Урок 7. Метки, оператор перехода, операторы управления циклами
Список Массив Работа с массивом
Урок 8. Список. Массив. Работа с массивом
Список — это упорядоченные скалярные данные. Массив - переменная, которая содержит список. Каждый элемент массива — это отдельная скалярная переменная с независимым скалярным значением.
Массивы могут иметь любое число элементов. Минимально возможный массив не имеет элементов вообще, тогда как максимально возможный может заполнять всю наличную память.
Список состоит из значений, отделенных друг от друга запятыми и заключенными в круглые скобки. Эти значения образуют элементы списка.
(1,2,perl,3.14159) - список из 4-х значений.
Элементы списка не обязательно должны быть константами. Это могут быть выражения, которые вычисляются при каждом использовании списка. Например:
($a,$a**$b,$b+33) -список из 3-х элементов.
Список можно присвоить особому типу переменных - массиву. Такая переменная начинается с символа "@", а не "$" как обычная скалярная переменная. Обращение к элементам массива идет через индекс массива. Каждому элементу массива соответствует скалярная переменная с именем массива.
Пора Вам рассказать о том, что оператор print способен выводить не только скалярные данные, но и списки. Приведенная ниже программа демонстрирует работу с массивом.
#!/usr/bin/perl print "Content-Type: text/html\n\n";
@ar=(1,2,3); $ar[0]++; print @ar,"
"; print $ar[0],$ar[1],$ar[2];
Первый элемент массива имеет индекс 0, значит последний - общее число элементов минус единица. Можно присвоить какой-нибудь скалярной переменной массив. В таком случае в переменную запишется кол-во элементов этого массива. При присваивании скалярной переменной списка, в неё записывается последний эл-т списка. Проверим:
#!/usr/bin/perl print "Content-Type: text/html\n\n";
@array=(0,2,4.5,Perl); $ar=@array; $ar1=(0,2,4.5,Perl); print @array,"
"; print $ar,"
"; print $ar1,"
"
Списки можно присваивать не только массивам и скалярам, но и, собственно, спискам. Если в левом списке эл-тов больше чем в правом, последние эл-ты этого списка уничтожаются. Если в левом списке эл-тов меньше чем в правом, часть эл-тов правого списка ничему не присвоится. В списки можно вкладывать и массивы:
#!/usr/bin/perl print "Content-Type: text/html\n\n";
$d="22"; @ar=(3,2,1); ($a,$b,$c,$d)=@ar; print ($a,$b,$c,$d,"
"); @ar1=(@ar,"It works!"); print @ar1;
Если в качестве значения индекса массива указать список элементов, можно получить все их значения в виде списка. Такое использование называется срезом массива. Отрицательное значение индекса обозначает номер позиции элемента с конца:
#!/usr/bin/perl print "Content-Type: text/html\n\n";
@array=(1,2,3,4); print @array[0,-3];
Метасимволы
Урок 9. Метасимволы
В этом уроке я дам вам довольно трудный для понимания материал, но который необходимо усвоить. Без знания этого материала вы не сможете проводить дальнейшее изучение Perl.
И так, что же такое метасимволы? Метасимвол - это особая последовательность символов, которая выполняет роль непечатаемого символа, либо какую-либо другую специфическую роль.
С некоторыми такими символами Вы уже знакомы, это "$", которым мы обозначаем скалярные переменные, и "@", которым обозначаем массив. Другие часто встречающиеся метасимволы приведены в таблице ниже.
| \t |
символ табуляции |
| \n |
символ возврата каретки и перевода строки |
| \b |
backspace (забой) |
| \034 |
восьмеричный символ |
| \xla |
шестнадцатеричный символ |
| \l |
нижний регистр следующего символа |
| \u |
верхний регистр следующего символа |
Это не полная таблица, за дополнительным материалом обращайтесь к справочным пособиям.
Давайте подробнее поговорим о метасимволе "\n". Это ни что иное как признак конца строки. К примеру, когда Вы набираете текст в текстовом редакторе и нажимаете "Enter" для перехода к новой строке, вы просто добавляете этот символ.
Помните, когда мы проходили двойные и одинарные кавычки я говорил Вам, что в двойных кавычках переменные интерполируются, а в одинарных - нет?! Так вот, это не совсем так. Интерполируются не переменные, а метасимволы. Теперь Вы должны это запомнить.
Давайте рассмотрим такую ситуацию, когда нам необходимо вывести на экран последовательность символов "\n", а не метасимвол. В таком случае выводимую строку можно заключить в одинарные кавычки и интерполяции не произойдет. А если ситуация не позволяет этого делать? Допустим, в этой же строке нам нужно вывести и значение некоторой переменной? Безусловно, мы можем заключить переменную в двойные кавычки, а последовательность "\n" в одинарные и выводить всё поотдельности. Но делать этого не следует, т.к. в Perl предусмотрен еще один метасимвол, говорящий интерпретатору, что следующий символ не подлежит интерполяции. Другими словами этот символ отменяет действие следующего за ним метасимвола. Таким метасимволом является "\" (обратный слеш). Обратите внимание на следующий пример:
print "...и он спросил: "А где ж твоя голова?"..."; - выполнение такой строки приведет к неминуемой ошибке. С точки зрения Perl, строка для вывода началась с открытия первой двойной кавычки и закончилась второй, а не последней. Для Perl кавычки в данном случае - флаги, он рассматривает их не как обычные символы, предназначенные для вывода, а как метасимволы. С помощью символа "\" можно снизить пристрастность Perl к наблюдению за кавычками. Посмотрите как легко можно превратить кавычки в обычные символы:
print "...и он спросил: \"А где ж твоя голова?\"...";. С точки зрения Perl, эта строка безупречна и не содержит ошибок.
Также обстоят дела и с последовательностью "\n". Достаточно поставить перед ней обратные слеш, и она будет восприниматься как группа обычных символов: "\\n".
Обратным слешом удобно пользоваться когда речь идет о выведении HTML кода с подстановкой переменных, к примеру тега : print "$size\" color=\"black\" face=\"Times new roman\">"; . В зависимости от значения переменной $size выводимая строка может быть любой. К примеру, если её значение - 4, строка получится следующей:
Использование \n при выводе страниц
Вспомните урок 5, где мы изучали оператор повторения FOR. Запустите программу, отображающую таблицу Пифагора и посмотрите в браузере исходный текст HTML. Вы увидите, что весь HTML файл написан в одну строку. Согласитесь, что это очень неудобно с точки зрения анализа выводимых данных.
Давайте модернизируем программу таким образом, чтобы она выводила HTML текст в несколько строк. Для этого достаточно поместить метасимвол "\n" после перевода строки тегом
:
#!/usr/bin/perl #programm 8 print "Content-Type: text/html\n\n";
print ''; for($i=1;$i<=9;$i++){ for($u=1;$u<=9;$u++){ if(($u*$i)/10 < 1){print" "} unless($u*$i==1){print $u*$i}else{print" "} print " "; } print"
\n"; } print '';
Вот теперь полный порядок!
* * * *
Напишите программу, которая выводит несколько произвольных E-mail адресов по одному на каждой строке. Используйте тег
и символ возврата каретки для форматирования.
Напишите программу, которая выводит строку, заданную в переменной. Первый символ строки должен быть в верхнем регистре.
Примечание: это будет работать только со строками, содержащими английские символы.
|
|
Запись в тело файла
Запись в тело файла
Нетрудно догадаться, что работать с файлом (считывать и записывать информацию) можно только тогда, когда он открыт.
Выводятся данные в файл всё тем же оператором Print. Оператору необходимо указать, в какой именно файл (может быть несколько одновременно открытых файлов) следует выводить информацию, затем помещают выражение, предназначенное для вывода:
open (file,">>file.txt"); print file "Здесь был Вася"; close file;Если не указать файловую переменную, строка "Здесь был Вася" выведется на экран браузера.