Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 [ 9 ] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103

Сложив все вместе, получаем:

# /usr/bin/perl -W

print "What IS your name? ";

5name = <STDIN>;

chomp ($name);

print "Hello, $name\n";

Добавляем возможность выбора

Допустим теперь, что у нас припасено какое-то особое приветствие для пользователя по имени Рэндал, а для остальных - обычное. Для этого нам нужно сравнить имя, которое было введено, со строкой Randal, и, если оно совпадает, сделать что-то особое. Давайте добавим в программу С-подобную ветвь if-then-else и операцию сравнения:

# /usr/bm/perl

print "What IS your name? ";

Sname = <STDIN>;

chomp (5name);

if ($name eq "Randal") {

print "Hello, Randal I How good of you to be hereXn"; ) else {

print "Hello, 5name\n"; # обычное приветствие

В операции eq сравниваются две строки. Если они равны (т.е. совпадают все символы и длина строк одинакова), результатом будет "истина". (В С и С++ подобной операции нет*).

Оператор if выбирает, какой блок операторов (заключенных между парными фигурными скобками) выполняется; если выражение дает в результате значение "истина", выполняется первый блок, в противном случае выполняется второй блок.

Секретное слово

Теперь, когда у нас есть имя, давайте сделаем так, чтобы человек, выполняющий эту программу, угадывал секретное слово. У всех, кроме Рэндала, программа будет непрерывно требовать ввести это слово, пока пользователь не наберет слово правильно. Сначала мы приведем текст программы, потом дадим пояснение к ней:

#/usr/bm/perl -w

"psecretword = "llama"; # секретное слово print "What IS your name? "; $name = <STDIH>; chomp $name;

if (5name eq "Randal") (

print "Hello, Randal Hovj good of you to be hereXn";

# Для получения аналогичного результата можно использовать стандартную подпрограмму libc. Но это не операция



else (

print "Hello, $name! \n"; # обычное приветствие

print "What is the secret word?

$guess = <STDIN>;

chomp ($gue3s) ;

while ($gueS3 ne Ssecretword) (

print "Wrong, try again. What is the secret word?

Sguess = <STDIN>;

chomp ($guess);

Сначала мы задаем секретное слово, помещая его в скалярную переменную $secretword. После приветствия программа спрашивает (посредством вызова еще одной функции print) у пользователя (не Рэндала) его вариант секретного слова. Этот вариант сравнивается с заданным секретным словом в операции пе. Данная операция возвращает значение "истина", если сравниваемые строки не равны (т.е. данная операция противоположна операции eq). Результат сравнения управляет циклом while, который выполняет этот блок операторов до тех пор, пока сравнение дает значение "истина".

Конечно, эта программа плохо защищена, потому что любой, кому надоест угадывать секретное слово, может просто прервать ее выполнение и вернуться к приглашению, а то и подсмотреть секретное слово в исходном тексте. Мы, однако, не пытались разработать систему обеспечения безопасности, а лишь хотели привести подходящий для данного раздела пример.

Несколько секретных слов

Давайте посмотрим, как можно модифицировать эту программу так, чтобы она принимала несколько секретных слов. Используя то, что мы уже видели, можно было бы многократно сравнивать вариант-догадку с рядом правильных ответов, хранящихся в отдельных скалярных переменных. Такой список, однако, было бы трудно корректировать или модифицировать в зависимости от дня недели и даты.

Более эффективное решение - хранить все возможные ответы в структуре данных, которая называется список, или (предпочтительнее) массив. Каждый элемент массива - это отдельная скалярная переменная, которой можно присваивать значение и затем использовать ее независимо от других. Можно также одним махом присвоить значение всему массиву. Мы имеем право присвоить значение всему массиву с именем Swords так, чтобы он содержал три возможных правильных пароля:

@words = ("camel", "llama", "alpaca");

Имена переменных-массивов начинаются с символа (§, что позволяет отличать их от имен скалярных переменных. Существует еще один способ записи этой конструкции так, чтобы не нужно было ставить все эти кавычки - с помощью операции qw (), например:

(Swords = qw(camel llama alpaca);



Это абсолютно то же самое; операция qw работает так, как будто мы взяли в кавычки каждую из трех строк.

Присвоив значения элементам массива, мы можем обращаться к каждому из них по индексной ссылке. Так, $words [0] - это camel, $words [1] - llama, а $words [2] - alpaca. Индекс может быть и выражением, поэтому если мы присвоим $х значение 2, то элементом $words [$i] будет alpaca. (Индексные ссылки начинаются с символа $, а не с @, потому что они обозначают один элемент массива, а не весь массив.) Вернемся к нашему предыдущему примеру:

#/usr/bin/perl -W

Swords = qw(camel llama alpaca);

print "What IS your name? " ;

?name = <STDIN>;

chomp ($name);

if ($name eq "Randal") (

print "Hello, Randal How good of you to be hereXn"; ) else (

print "Hello, $name\n"; # обычное приветствие

print "What is the secret word? "; $guess = <STDIN>; chomp {$guess) ;

$1=0; # сначала попробуем это слово

$correct = "maybe"; # догадка верна или нет

while (correct eq "maybe") { # продолжаем проверку if ($words[$i] eq $guess) ( # верно

$correct = "yes"; # да

) elsif (5i < 2) ( # смотреть еше слова

$1 = $1 + 1; # в следующий раз посмотреть следующее слово

} else ( # больше слов нет, должно быть, неверно

print "Wrong, try again. What is the secret word";

$guess = <STDIN>;

chomp ($guess);

$1 = 0; # вновь начать проверку с первого слова

) # конец цикла while для неверных слов } # конец цикла "не Рэндал"

Заметьте, что мы используем скалярную переменную $correct для того, чтобы показать, все еще ищем мы правильный пароль или уже нашли его.

В этой программе показан также блок elsif оператора if-then-else. Такой конструкции нет ни в одном другом языке программирования; это сокращенная запись блока else с новым условием if, но без вложения еще одной пары фигурных скобок. Сравнение набора условий в каскадной цепочке if-elsif-elsif-elsif-else очень характерно для языка Perl. В нем нет эквивалента оператору switch языка С или оператору case языка Паскаль, но вы можете сами без особых хлопот создать такой оператор. Подробности см. в главе 2 книги Programming Perl и на странице руководства perlsyn(\).



0 1 2 3 4 5 6 7 8 [ 9 ] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103