Анимация
JavaScript
|
Главная Библионтека Теперь, для того чтобы добраться до значения переменной через ссылку $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 Для улучшения читабельности программы можно поместить переменную, ссылающуюся на массив, в фигурные скобки, как показано ниже на примерах.
Например, в следующем фрагменте кода распечатываются все элементы массива 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 |