div.main {margin-left: 20pt; margin-right: 20pt}Пёрл для чайников. Глава 2
Итак вы всё же
решили встпть на тернистый путь Perl программиста и полностью испить эту чашу.
Ну что ж, похвально. Тогда пришло время познакомить вас с самым главным правилом
Пёрл: "Всегда есть несколько способов сделать
это!" Может пока это для вас непонятно, но поверьте - в этом вся
соль...
Ну и хватит
философствовать, пора заняться делом. В предыдущей главе мы остановились на
программе, которая считывает введенную дос команду, а затем её выполняет. Если
вы помните - я настойчиво не советовал вам вводить дос команду format, и если вы
это читаете, то наверняка вы этого не сделали. Но всегда будет опасность того,
что вашу прогу запустит кто-то другой. В этом случае нам просто необходимо
усовершенствовать нашу программу таким образом, чтобы при вводе команды format
как минимум ничего не форматировалось. Задумаемся: как это сделать? Нам нужно
посмотреть какая команда была введена, и в соответствии с этим разрешить или
запретить её. Т.е. будет поставленно условие, которое будет соблюдаться при
получении команды. Рассмотрим как это действует.
If (проверяем
условие) { Если всё правильно - сделать одно; } else { Если нет -
другое; }
В скобках после
оператора IF находится некое условие, которое в результате проверки даст нам
истину или ложь. Эти два понятия являются основными для Пёрл и поэтому вам
придётся смириться с их некоторой "странностью". Истиной в Пёрл является НЕ
пустая строка или, если речь идёт о числах, не ноль. Результатом проверки условя
и будет 1 или 0. Таким образом, если при поиске в введённой команде слово format
, мы получим истину, то выполнится первое действие, заключенное в круглые скобки
и называемое блоком операторов (например можно вывести строку с
сообщением об ошибке) иначе выполнится второй блок операторов.
Перед тем как
продемонстрировать вам апргейд нашей програмки, хочу обратить ваше внимание на
такую конструкцию:
If (условие1)
{ Первый блок операторов; } Elsif (уловие2){ Второй блок операторов;
} Elsif (условие3) { Третий блок; } Else { Четвёртый
блок;}
Такая форма записи
позволит вам задавать столько условий, сколько понадобится. А теперь -
долгожданный апгрейд:
print "enter
comand: "; chmod($com = <>); if ($com =~ /format/i) { print
"incorrect commanda"; } else { print `$com`; } print "Press
"ENTER" to quit"; <>;
Думаю для вас
здесь должно быть понятно всё, кроме того как мы искали в переменной $com слово
format. Данный поиск удобнее всего сделать с помоцью поиска по шаблону ,
но об этом я расскажу позже, а пока... Программа, которую мы написали конечно
интересна и даже защищает вас от форматирования, но она пока ецё не удобна -
ведь вам приходится каждый раз запускать программу снова. Давайте сделаем так,
что бы прога принимала команду, выполняла её и запрашивала новую до тех пор пока
мы не введём слово EXIT. В реализации данного вопроса нам понадобитя такая вещь
как цикл:
While (условие)
{ Блок операторов; }
Наверное вам это
покажется смешным, но цикл - это тоже основа Пёрл :) В отличаи от условия, цикл
один раз выполняет блок операторов, после чего проверяется условие. И если оно
истинно, то блок выполняется ещё раз. Иногда для наглядности применяют такую
форму записи:
do { Блок
операторов; } while
условие;
Словами это
всё можно было бы сказать так: "Выполнять до тех пор, пока условие
истинно" Но как же быть когда нам нужно сказать примерно следующее: "Делать
до тех пор пока условие не станет истинным"? В этом случае применяется оператор
until. Он имеет свойства обратные while и записывается также:
untli(условие){ Блок операторов;}
Или
do
{ операторы } until условие;
Для закрепления
информации приведу вам простейший пример:
print "enter
number 20 or 30: "; chmod($com = <>); while ($com <= 50)
{ $com++; print "$comn";} print "Press "ENTER" to quit";
<>;
Хотя вам наверняка
уже всё поняино, :) всё же объясню эту программу. В первой строке мы выводим
приглашение ввести число от 20 до 30. Во второй - мы его считываем в переменную
$com. С третьей по пятую строку мы задаем цикл условием, которое ставим так:
"Верно, пока $com меньше 50", а в блоке операторов сначала прибавляем единицу к
нашему числу, а затем печатаем его. Когда цикл завершится мы увидим на экране
череду цифр от введенного до 50 (если было введено больше, то ничего интересного
не произойдёт) и просьба нажать enter для завершения программы.
А теперь, то ради
чего всё это объяснялось - очередной апгрейд:
print
"enter comand:"; chomp($com = <stdin>); $pri = $com;
$com =~ tr/A-Z/a-z/; while ($com ne "exit"){ if ($com =~
/format/){ $bad = "$pri - BAD COMAND! n" x 999; print "$badn";
print "enter comand:"; chomp($com = <stdin>); $pri = $com;
$com =~ tr/A-Z/a-z/; } else{ print `$com`; print "enter
comand:"; chomp($com = <stdin>); $pri = $com; $com =~
tr/A-Z/a-z/; } } print "Press ENTER to quit"; <>;
В этой версии
нашей программы мы не толоко решили стоящую перед нами задачу, но и добави кое
что новое. Если бы мы ввели слово exit большими буквами (или хотя бы одна буква
была большой) , то желаемого эффекта мы не получили бы. Четвертая строка
переводит наше слово в нижний регистр (делает все буквы маленькими) уже
упомянутым методом поиска по шаблону, о котором будет рассказано в следующей
главе. Кроме того вас может заинтересовать: зачем мы копируем введенное слово из
$pri в $com? Это сделано для того, что бы ичспользовать первоначальный вариант
ввода позже. Например вы ввели FoRMaT, после четвёртой строки это будет просто
format, но в седьмой строке мы формируем новую переменную, в которой
используется первоначальный вариант, предусмотрительно нами сохраненный. Далее,
в восьмой строке, и это еще одно новшество, мы выводим полученную переменную 999
раз (чтоб повадно не было! :). Остальное не должно вызвать у вас затруднений,
однако если таковые возникли - повторите пройденный материал.
На этом с основами
циклов и условий поконченно! В следующей главе мы изучим поиск по шаблону и
выясним, почему в предпоследней версии нашей проги мы не использовали перевод
символов в нижний регистр, а прога всё равно работает как надо.
На последок даю
вам домашнее задание ( Взято из книги Рэндала Шварца "Изучаем Perl" )
:
Напишите
программу, которая читает список чисел (каждое из которых записано в отдельной
строке), пока не будет прочитано число 999, после чего программа выводит сумму
всех этих чисел. (Ни в коем случае не прибавляйте 999!) Например, если вы
вводите 1, 2, 3 и 999, программа должна ответить цифрой 6
(1+2+3).
Решение для
проверки и для ленивых здесь
NS
|