07 марта 2021 года    
Воскресенье | 22:05    
Главная
 Новости
Базы данных
Безопасность PC
Всё о компьютерах
Графика и дизайн
Интернет-технологии
Мобильные устройства
Операционные системы
Программирование
Программы
Связь
Сети
 Документация
Статьи
Самоучители
 Общение
Форум







Разделы / Интернет-технологии / Perl

Пёрл для чайников. Глава 2

Пёрл для чайников. Глава 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 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 = <stdin>);
$pri = $com;
$com =~ tr/A-Z/a-z/;
while ($com ne "exit"){
if ($com =~ /format/){
$bad = "$pri \- BAD COMAND! \n" x 999;
print "$bad\n";
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

 Пёрл для чайников. Глава 2
Лента новостей


2006 (c) Copyright Hardline.ru