Библиотека Интернет Индустрии I2R.ru |
|||
|
Perl для чайников (Учебник, ч. 2/3)Итак вы всё же решили встпть на тернистый путь 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 command\a"; } 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 "$com\n";} print "Press \"ENTER\" to quit"; <>; Хотя вам наверняка уже всё поняино, :) всё же объясню эту программу. В первой строке мы выводим приглашение ввести число от 20 до 30. Во второй - мы его считываем в переменную $com. С третьей по пятую строку мы задаем цикл условием, которое ставим так: "Верно, пока $com меньше 50", а в блоке операторов сначала прибавляем единицу к нашему числу, а затем печатаем его. Когда цикл завершится мы увидим на экране череду цифр от введенного до 50 (если было введено больше, то ничего интересного не произойдёт) и просьба нажать enter для завершения программы. А теперь, то ради чего всё это объяснялось - очередной апгрейд: print
"enter comand:"; chomp($com
= В этой версии нашей программы мы не толоко решили стоящую перед нами задачу, но и добави кое что новое. Если бы мы ввели слово exit большими буквами (или хотя бы одна буква была большой) , то желаемого эффекта мы не получили бы. Четвертая строка переводит наше слово в нижний регистр (делает все буквы маленькими) уже упомянутым методом поиска по шаблону, о котором будет рассказано в следующей главе. Кроме того вас может заинтересовать: зачем мы копируем введенное слово из $pri в $com? Это сделано для того, что бы ичспользовать первоначальный вариант ввода позже. Например вы ввели FoRMaT, после четвёртой строки это будет просто format, но в седьмой строке мы формируем новую переменную, в которой используется первоначальный вариант, предусмотрительно нами сохраненный. Далее, в восьмой строке, и это еще одно новшество, мы выводим полученную переменную 999 раз (чтоб повадно не было! :). Остальное не должно вызвать у вас затруднений, однако если таковые возникли - повторите пройденный материал. На этом с основами циклов и условий поконченно! В следующей главе мы изучим поиск по шаблону и выясним, почему в предпоследней версии нашей проги мы не использовали перевод символов в нижний регистр, а прога всё равно работает как надо. На последок даю вам домашнее задание ( Взято из книги Рэндала Шварца "Изучаем Perl" ) : Напишите программу, которая читает список чисел (каждое из которых записано в отдельной строке), пока не будет прочитано число 999, после чего программа выводит сумму всех этих чисел. (Ни в коем случае не прибавляйте 999!) Например, если вы вводите 1, 2, 3 и 999, программа должна ответить цифрой 6 (1+2+3). Решение для проверки и для ленивых здесь
|
|
2000-2008 г. Все авторские права соблюдены. |
|