Анимация
JavaScript
|
Главная Библионтека И последняя функция, которую мы рассмотрим на этом занятии, - reverse. Она очень простая. В скалярном контексте в качестве параметра ей передается скаляр. Функция обращает порядок следования символов и возвращает полученную строку. Например, reverse( "Perl" )в скалярном контексте возвращает IreP, В контексте списка функция reverse возвращает список, элементы которого расположены в обратном порядке: nines=qw(He будем прогибаться под изменчивый мир); print joinC reverse sort Klines); В этом примере вначале выполняется функция sort, которая сортирует список будем, прогибаться, под, изменчив1й, мир). Этот список перестраивается в обратном порядке с помощью функции reverse и передается в качестве параметра функции join для объединения в строку. В качестве разделителей используются пробелы. Результат - прогибаться под мир изменчивый будем Не. Правда, трудно не согласиться с этим утверждением? Упражнение: небольшая игра На этом занятии вы получили большое количество новой, зачастую неожиданной, информации. Оказалось, что знакомые операторы ведут себя совершенно по-разному в зависимости от контекста. Вы познакомились с новыми операторами и функциями, а также изучили несколько нов1х синтаксических правил. Чтобы вы не впали в депрессию от такого обилия информации, я придумал игру, способную нейтрализовать ваши негативные эмоции. Наберите в текстовом редакторе программу, приведенную в листинге 4.1, и сохраните ее в файле Hangman. Сделайте файл выполняемым, согласно инструкциям, приведенным на 1-м занятии. После этого попытайтесь запустить программу, набрав в командной строке perl Hangman В листинге 4.2 приведен пример диалога с программой Hangman. Листинг 4.1. Исходн1й текст программы Hangman :L: It/usr/bin/perl-w 3: ?words=qw йшЕрег Ответ Гинтер Программа ) ; 4: $guesses[0]=--; 5: $wrong=0; 7: Schoice=5words[rand BwordsJ; 8: Shangman=-0-l-<; 10:*letters=split( , Schoice); ll:ehangmaii=split( , {hangman); 12:eblankword=(0) x scalarfehangman); 13:OUTER: 14: while (Swrong<«hangEan) { 15: foreach $i (0..$1letters) { 16: if (Sblank¥ord[$i)) { 17: print $blankword($i]; 18: } else { 19: print 20: } 21 : } 22: print "\n"! 23: if (Swrong) { 24: print ehangmanfO..$wrong-lI 25: } 26: print "\n Bai aficp: "; 27: 5guess=<STDIH>; chaip Sjguess; 28: foreach(«guesses) { 29: iK3xt if {$ eq $guess); 30: } 31: $guesses($tguesees]=$guess; 32: $right=0; 33: for ($1=0; $i<81etters; $i++) { 34: if ($letters[$ii eq $guesB) { 35:. $blankword[$l]=$guesB; 36: $right=l; 37: } 38: } 39: Swrong++ unless(Sright); 40: if (join(", Jblankword) eq $choice) { 41: print "ai угадали I\n"; 42: exit; 43:., } 44: } 45: print $Ьапдшап\п ХЁчалЕнэ, нэ йдю захддагоохво $cholce.\n-; анализ протраммы. • Строка 1. В этой строке находится путь к интерпретатору (измените его в соответствии с конфигурацией вашей системы) и ключ -w. Всегда включайте режим вгдачи предупреждений! • Строка 3. Массив Swords инициализируется списком допустимых в этой игре • Строки 4-5. Инициализируются некоторые переменные. Массив §guesses служит для хранения ранее введенных букв. Переменная $wrong содержит количество неудачных ответов. • Строка 7. Из массива rds случайным образом выбирается слово и присваивается переменной $choice. Функции rand{) должен передаваться скалярный аргумент, поэтому конструкция Swords воспринимается как скаляр. Значение Swords в скалярном контексте - количество элементов массива Swords, в данном случае 4. Функция rand возвращает случайное число в диапазоне от 0 до 4, не включая крайние значения. При использовании числа с плавающей точкой в качестве индекса массива знаки после запятой отбрасываются. • Строка 8. Формируется фигурка. • Строка 10. Загаданное слово разбивается на буквы, которые помещаются в массив • Строка 11. Фигурка разбивается на части, которые помещаются в массив ehangraan. Причем $hangman[0]- голова, $hangman[l] - щея и т.д. 78 Чть овы Perl • Строка 12. Массив bord предназначен для отображения положения правильно угаданных букв. Вначале в gblankword находится список (0) х зса1аг(Йhangman), длина которого равна количеству элементов мдтап. Затем постепенно нули заменяются на угаданные буквы. Это делает строка 35 кода. • Строка 14. Это основной цикл программы. У него . есть метка CUJIEI позволяющая использовать специальные операторы управления циклом. Этот цикл выполняется, пока количество неправильных ответов не сравняется с длиной фигурки. • Строка 21. Цикл foreach проверяет элементы массива word, и все угаданные буквы распечатываются, а еше не угаданные заменяются дефисами. • Строка 25. Переменная ong содержит количество неправильных ответов. Если имеется хотя бы один неправильный ответ, печатаются Swrong на-чальн1х элементов массива S hangman. • Строка 27. Эти строки вводят ответ игрока. Функция cho удаляет завершающий символ новой строки. • Строки 28-30. Эти строки проверяют, не вводился ли символ ранее. Если да, цикл снова начинается со строки 13. Игрок не наказывается за повторение неправильного ответа. .... • Строка 31. Введенная пользователем буква помешается в массив Sguesses. • Строка 38. Это сердцевина программы. В массива ers, содержащем загаданное слово, ищется буква ответа. Если буква найдена, она присваивается соответствующему элементу массива 8blankwords. Все элементы массива §blankwords - это или угаданные буквы, или нули. Флаг $right получает значение 1, если хотя бы одна буква правильно угадана. • Строка 39. Переменная ong увеличивается на единицу при каждом неправильном ответе пользователя. • Строка 43. Элементы массива words объединяются в строку, которая сравнивается с исходным словом. Если они совпадут - это означает, что пользователь полностью угадал слово. • Строка 45. Основной цикл программы завершается, посколькфок исчерпал все свои попытки. Программа выводит сочувственное сообщение и выходит из ИфЫ, 4.2.Образецдиалогас огрмой Ме Ваш выбор: е Bai выбор: о -в- Ваш выбор: п -о- 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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |