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

Теперь, для того чтобы добраться до значения переменной через ссылку

$bref2, нужно использовать конструкцию $$$bref2 Обратите внимание, что для сс1л-ки на переменную Sbook через $bref использовалась конструкция $$bref Таким образом, "лишний" знак доллара обозначает, что для доступа к оригинальному значению переменной Sbook нужно сделать дополнительную операцию разыменования.

ССЫЛКИ на массивы

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

$aref=\iarr;

В результате скалярная переменная $aref будет содержать ссылку на массив Визуально это можно представить в виде следующей диаграммы:

Saref garr

0 1 2 3 4 Данныелааныё[данныё[данные[данные

Для доступа к элементам массива Nrr через переменную-сс1лку $aref можно использовать один из приведенных ниже операторов:

SSaref [0] Первый элемент массива garr

«$aref [2,3] Сечение массива §arr

U&ief Весь массив @arr

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

S$aref[0]

тожето и

S{$aref}[0]

§Saref[2,3]

то же, что и

g{Saref}[2,3]

e?aref

тожето и

e{$aref}

Например, в следующем фрагменте кода распечатываются все элементы массива 9агг с помощью переменной-ссылки Saref.

foreach (elenen ref>) { print $element;

} . . . . .

ССЫЛКИ на хэши

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

$href=\%hash-,

В результате скалярная переменная $href будет содержать ссылку на хэш Визуально это можно представить в виде следующей диаграммы:

13-й час ктуры и ссылки - 203



$href Ihash

Ключ Ключ Ключ Ключ Ключ [данные] ДанныеЛаа11Йе[данныеданные

Для доступа к элементам хэша через переменную-ссылку можно ис-

пользовать один из приведенных ниже операторов.

5Shref{)cey} Отдельный элемент хэша *hash, адресуемый ключом key. До-

пустима также конструкции ref) {key}

%$href Весь хэ ШвЬ. Допустима также конструкция %${href)

Например, для распечатки всех элементов хэша с помощью переменной-

ссылки можно воспользоваться следующим фрагментом кода:

foreach Skey (ke ef J {

print $$href{$lcey}; » To же, что в $haBh{$key}

ССЫЛКИ на аргументы

После того как мы рассмотрели ссылки на массивы и пришло время пого-

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

фрагмент кода не работает.

t имани! ДШЕЗьй кед нает 1 sub geics {

efruit:qw{x6noKo areicsH бавав}; fcweggies=qw{M:5KaBbKa6arapeflBC}; getarrayB(§fruit, eveggies);

Этот фрагмент кода не работает потому, что в операторе вызова подпрограммы getarrays(?fruit, Gveggies) второй массив Aggies затеняется первым массивом ifruit, и элементы обоих массивов присваиваются одному массиву в . Внутри подпрограммы getarrays выполняется оператор присваивание ib)=(j! . В результате все элементы массива окажутся в массиве 8а, а массив окажется пустым.

Поскольку элементы обоих массивов при передаче в подпрофамму getarrays оказались в массиве нельзя определить, где заканчивается один массив и начинается другой. В результате получился один большой массив.

Чтобы разрешить проблему, необходимо воспользоваться ссылками, т.е. в подпро-фамму getarrays нужно передавать не два массива, а только ссылки на них. Вот пример:

I ДНЕзьй код прекрас раба! subgetarcsb {

пу ($fruit ref, $veg rel)=t j

efruit=q¥{H6noKo агЕпьсин банан}; eveggiesgvfMopKOBb кабатаредсс:}; getarrays(\gfruit, \eveggies);



Теперь подпрограмме getarrays всегда передаются два параметра, являющиеся ссылками на массивы. При этом размерность этих массивов не имеет никакого значения. Для доступа к элементам массивов внутри подпрограммы getarrays используются переменные-ссьшки $fruit ref, $veg ref, как показано ниже.

sub getarrays { ,

ny {Sfruit ref, Sveg ref )=(! ;

print "Фрукты;", join(,, e$fruit ref); EErint "Овощи:-, joinC,, %$veq ief);

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

t Передача значений I Передача ссылок

sub changehash { sub changehash {

my{%local hash)=§j my($href)=« ;

$local hash{beast}=iieflBeflb;

} return;

>

%hash=(fish => aira,

tdzd => ДОЗЗД); %hash=(fish => aira,

changehash(Ihash); hud => деозд);

changehash (Mhash);

В примере слева хэш передается обычным образом. При этом массиву присваиваются пары ключ-значение передаваемого в подпрограмму хэша Внутри подпрограммы changehash элементы массива копируются в новый хэш который модифицируется, после чего подпрограмма завершает свое выполнение. В результате хэш уничтожается, а первоначальный хэш в главной программе остается без изменений.

В примере справа в подпрофамму changehash через массив передается ссылка на хэш fchash. В начале подпрофаммы ссьшка копируется в локальную переменную $href, но, несмотря на это, она по-прежнему указывает на хэш Далее внутри

подпрофаммы происходит изменение хэша, на который указывает ссылка $href, и подпрофамма завершает свое выполнение. В результате в хэше появится новый

ключ beast, которому присвоено значение медведь.


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

Создание структур

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



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