Анимация
JavaScript
|
Главная Библионтека Примеры других структур В предыдущем разделе была рассмотрена методика создания одной из основных структур Perl - двумерного массива - с помощью списка списков. Поскольку на размеры массивов, скаляров и хэшей в Perl не накладывается какого-либо ограничения, комбинируя их, вы можете создавать структуры данных любой сложности. Ниже перечислено несколько примеров таких структур: • список, элементы которого являютсяхэшами; • хэш, элементы которого являются списками; • хэш, элементы которого являются хэшами; • хэши, элементы которых являются списком, а элемент тска являются хэшами, и т.д. Из-за недостатка места на страницах этой книги мы даже не будем пытаться описать все эти структуры. В электронном справочном руководстве по Perl есть специальный раздел, который называется Perl Data Structure Cookbook. В нем очень подробно описаны все перечисленные выше структуры данных и много других. Правда, язык изложения несколько труден для понимания. Для каждой рассматриваемой структуры в электронной документации приводятся следующие сведения: • методика объявления структуры на примере литералов; • способы наполнения структуры данными; • процесс добавления нов1х элементов; • способы доступа к отдельным элементам структуры; • методика перебора всех элементов структуры. Для отображения раздела Perl Data Structure СшИэюк наберите в командной строке perldoc perldsc. Отладка амм, использующих ссылки При отладке программ новички часто путаются со ссылками и не могут понять, на структуру какого вида сстлается конкретная ссылка. Масла в огонь подливает и не совсем прозрачный синтаксис операторов со ссылками. Тем не менее в Perl предусмотрены средства, с помощью которых вы быстро поймете, что происходит в программе. Для начала попытайтесь просто распечатать значение ссылки. При этом Perl отобразит тип структуры данных, на которую указывает ссылка. Например, оператор print $myatery reference; выведет примерно такое сообщение: ARRAY(0xl23192O) Оно означает, что в переменное reference хранится ссылка на массив. Кроме массива, возможна ссылка на скаляр (SCALAR), хэш ASH) и подпрограмму (DE). Чтобы распечатать содержимое массива, на который указывает переменная $mystery reference, необходимо интерпретировать эту ссьшку как массив. Вот пример: print joinC,, e{$mystery reference}); В отладчике также предусмотрены средства, позволяющие легко определить тип ссылки. Для этого нужно распечатать содержимое переменной-ссылки, как это вы делали при отладке обычных программ. В следующем примере исследуется содержимое переменной-ссылки Sref. DB<2> print Sref " HASH(0xl84b5O) Очевидно, что переменная $ref указывает на хэш. В отладчике предусмотрена специальная команда х, с помощью которой можно распечатать значение ссылки и элементы той структуры, на которую она указывает: DB<3> X $ref О HASH(Oxl84b50) apple => fruit carrot => vegetable pear => fruit ® В данном случае ссылка указывает на хэш, в котором находятся три элемента с ключами apple, carrot и pear. Отладчик может также распечатывать и более сложные структуры данных, например списки списков, как показано в следующем примере: х $а О ARBAY(0xb3300) 0 ASRAY(0xle8694) t Гвая сцрска двХхсюэ LSCOOBa 0 EtiEd ♦ Зиеты гвсй слрски 1 EMW 2 ifercscfes 1 ARRAY(0xlb74cc) t Вгсрая сцроа дв1.нзпэ ьвсхзлва. 0 "Ibyota t Зиеты кгсрсй слрски 1 -Mfez 2 Mitsubd 2 ARRAY(0xle8478) f Третья спрска двмёрсно ьвсадва. 0 Ifei:gect t Згавны третьей сярски 1 Rault 2 Citroen В этом примере переменная $а указывает на массив В свою очередь элементы этого массива ссыпаются на три других массива- ARRAY(0xle8694), RAY(Qxib74cc) 1е8478). А каждгй из вложеннгх массивов содержит по три элемента. i В модуле Data::Dumper предусмотрена специальная функция для распечатки содержимого ссылок. Этот модуль интересен тем, что выводимая им информация имеет формат, который понимает Perl. Таким образом, вы можете сохранить информацию в файле, а затем загружать ее по мере необходимости. В результате вы получите возможность сохранять значения переменных на диске. Модуль Data ширег будет описан на 14-м занятии, "Использование модулей". Упражнение: еще одна игра - лабиринт После того как вы узнали столько нового и непонятного об этих странных ссылках и структурах данных, вам нужно немного развлечься. Ь этом разделе мы рассмотрим упражнение, демонстрирующее использование структур и ссылок на примере простой игры. Игра создана по образу и подобию классических игр - задача состоит в том, чтобы найти выход из лабиринта. Собственно лабиринт будет очень простым - он состоит из комнат с одной или несколькими дверями. Двери могут располагаться во всех четырех стенах комнаты (в северном, южном, восточном и западном направлениях). Цель игры - найти секретную комнату, к которой ведет только один правильный путь. Остальные пути ведут в тупик. Итак, наберите в текстовом редакторе программу, приведенную в листинге 13.1, и сохраните ее в файле под именем Maze. Запустите программу и сыграйте с компьютером в игру, как показано в листинге 13.2. bin/perl 2: use strict; 3: 4 : 5: 6: 7 : 8: 9: шу §maze=( [ qw( в D3B зв зю ) ] , [ qw{ св свз юз сю ) ] , [ qw( СП - сю зс ) J, f qw( св 3 св 3 ) ] , 10: tion=( с. J, D , [1,0], в , [ОД], 3 ,. (0,-11,); nY%full=(B , восток, с , север, з , запад, ю , юг); my(Scurr X, $curr у, $х, $У)=(0,0,3,3); $ve7 12 : 13 : 14: 17: sub disp location { 18: юу($сх, Scy)=e ; 19: print "Вэ1 можете пойти на "; 20: тлМ1е($таге[$сх] [$су] ="/([сюзв1)/д) { 21: print "$full{$l} 22 : } 23: print "($inaze[Scxj[$cy])\n-; 24: } 25: subm3ve to { 26: my(Snew, Sxref, ?yref)=e ; 28: Snew=substr(lc($new),0,l); 29: if ($naze[S$xref](S$yref]r/Snew/) { 30: print "Ошибочное направление $iie\». \n"; 31: return; 32 : } 33: $$xref += $direction{$new)tO); 34: S$yref += $direction{$new}[l]; 35: } 37 : until ( $сигтг х == $x and $сигтг у == $y) { 38: disp location(Scurr x, $curr y); 39: print "Куда идеи? "; 40: $mDve=<SIDIN>; dionp $m3ve; 41: exit if ($rrove =" /"q/); 42: nove to($ve, \$curr j, \$curr y); 43: } 45: print "Поздравляем! Вы вашяя из лабирннтаУп"; 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 |