Анимация
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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

Примеры других структур

В предыдущем разделе была рассмотрена методика создания одной из основных структур 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