Анимация
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

13-й час

Структуры и ссылки


Материал этого занятия может быть интересен тем, кто только начал изучать программирование и для кого Perl - первый язык программирования. В большинстве языков предусмотрены средства, с помощью которых можно из одной области памяти сослаться на данные, находящиеся в другой области памяти. В одних языках программирования (Pascal и С) эти средства называются указателями (pointers), в других (ассемблер) - косвенными ссылками (indirect references), а в BASIC или Java, например, подобные средства вообще не предусмотрены. Поэтому, если раньше вы никогда не пользовались ссылками, указателями или косвенными ссылками, внимательно несколько раз прочтите вступительный раздел данного занятия, поскольку он очень труден для восприятия.

В Perl также предусмотрены подобные средства, которые называются ссылками (references). Ссылки в Perl используются для разные адей, однако на данном занятии мы сосредоточим свое внимание на вызовах функций, которым передается несколько аргументов сложных типов, а также на том, как можно создать сложный тип данных, например список списков.

Ссылку можно сравнить со старым библиотечным каталогом. Каждой бумажной карточке в каталоге соответствует книга на одной из полок библиотеки. В карточке указывается, к какой категории относится книга (художественная литература, техническая, справочник) и где она расположена в библиотеке. В некоторых библиотечных

каталогах можно найти несколько ссылок на одну и ту же книгу, которая относится к разным категориям, а иногда можно даже найти ссылку из одной карточки на другую

(типа см. также...).

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

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



Основные сведения о ссылках.

Создание структур данных из ссылок.

Короткий пример, который поможет понять материал.

Основные сведения

Обычные скалярные переменные создаются с помощью оператора присваивания, например:

$а="С1сапяр"? # ЭгоойнЕьйскалф

После выполнения этого оператора Perl создаст скалярную переменную $а и присвоит ей строковое значение "Скаляр". Итак, до сих пор вы не встретили ничего необычного, не правда ли? Можете считать, что в компьютере выделяется участок памяти, называемый $а, который содержит строковое значение, как показано ниже.

[Скаляр]

Теперь, если вы присвоите значение скаляра $а другому скаляру, например $Ь с помощью оператора в памяти компьютера создается две одинаковые копии

данных, которым присваиваются разные имена, как показано ниже.

Sa Sb

[Скаляр] [Скаляр]

Подобный оператор присваивания может пригодиться в том случае, если вы действительно хотите иметь две независимые копии данных. Однако чаще всего нужно, чтобы обе переменные $а и $Ь соответствовали одному и тому же участку данных, а не его копии. В этом случае дует создать ссылку. Ссылка является просто указателем на некоторый участок памяти. Не забывайте, что она не содержит никаких реальных данных! Ссылка обычно хранится в скалярной переменной.

Чтобы создать ссылку на скалярную переменную, перед именем переменной следует поместить символ обратной косой черты. Например, чтобы создать ссылку $ref

на переменную $а, используется такой оператор присваивания: $ref=\$M Сс:ьшка на хЕреазню $а

В результате в памяти компьютера создается такая структура:

$ref Sa

При этом в переменной $ref не содержится никаких реальных данных; в эту переменную помешается указатель (или адрес) переменной $а. Обратите внимание, что

при создании ссылки значение переменной $а не изменяется. После создания ссылки с переменной $а можно выполнять те же действия, что и с обычной переменной, например присваивать значения или распечатывать (print $а).

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



оператора print, то получите нечто вроде Чтобы получить доступ к со-

держимому переменой 5а через ссылку $ref, необходимо выполнить так называемую операцию разыменования переменное ef. Представьте себе, что на предыдущем рисунке вы должны двигаться по стрелке к переменной .$а. Это и будет разыменование. Например, чтобы распечатать значение переменной $а через ссылку $ref, к ссылке

необходимо добавить дополнительный символ $:

print $$ref;

В этом примере, естественно, подразумевается, что переменная $ref является ссылкой, а дополнительный знак доллара говорит интерпретатору о том, что это ссылка на неременную скалярного тина. В результате выбирается и распечатывается значение неременной, на которое указывает неременная $ге£.

С помощью ссылки можно также изменить первоначальное значение переменной. Это еще одно преимущество использования ссылок по сравнению с переменными-копиями. В следующем примере значение переменной $а будет изменено:

S$ref="HoBoe значением";

Данный оператор будет выполняться по следующей схеме:

Sref $а

[ Зг1Нов значение!

Если по ошибке в операторе присваивания вы укажете $ref вместо $$ref:

Sref="0inH6Ka!";

ссылка на переменную $а аннулируется и переменной $ref присваивается реальное значение - строка "Ошибка!", как показано ниже.

01юб1са1 I Скаляр!

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

$паше="Евгений";

$nref=\$naine; * Ссыпка га пЕрЕМЕннуЮ $naie $aref=$nref; \ Hip опда схыпка на пшшнуЮ $name

В результате получается следующая схема:

$nref $name ggref

о I» Евгений1<1о""

В этом примере для получения значения переменной $name ("Евгений") можно использовать две ссылки $$nref и $$oref. Кроме того, можно создать ссылку на ссылку, как показано ниже на примере:

$Ьоо1с="Война и мир";

Sbref=\5book; ♦ Ссыпка на пераувэт/ю $Ьсок

$bref2=\$bref; \ Ссыпка на пераувэт Sbref (не на Sbook!)

В данном случае цепочка ссылок будет выглядеть так:

SbreJ2 Sbref Shook

о-ЬИ Война и mhpI

Чть II. углубляемся e



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