Анимация
JavaScript
|
Главная Библионтека как они созданы) не требуется наличия самих элементов данных (скаляров, массивов или хэшей), на которые они ссылаются. Тем не менее после создания ссылки Perl сохраняет элементы массива или хэша, даже если они по логике должны быть аннулированы (например, при выходе переменной из зоны видимости). В* приведенном ниже примере хэ ash создается внутри блока кода, причем он является локальным для этого блока. пу $href; { my thash=(phone => Бепп, 1л#± => дцжхн); $href=\%hash; print $Shref (light); f БудетшгЕчагаЕГ) "прссн" Внутри блока скаляру $href присваивается ссылка на локальный хэш %hash. После завершения работы блока ссылка на хэш %hash остается в активном состоянии, несмотря на то что переменная *hash была объявлена локальной для блока, вышла из зоны видимости и должна быть аннулирована. Таким образом, ссылки на скаляры, массивы, хэши и структуры будут существовать даже после выхода этих объектов . из зоны видимости блока или подпрограммы. В нашем примере с помощью ссылки $href можно модифицировать хэ ash вне зоны его видимости (т.е. за пределами блока, в котором он был объявлен). Если вы внимательно посмотрите на предгдущий блок кода, то увидите, что нет особого смысла объявлять локальный хэш и назначать ему имя %hash, поскольку оно используется только один раз. Для подобных случаев Perl предусмотрено специальное средство создания ссылок на структуры данных без назначения им промежуточных имен (типа lhash). Речь идет о так называемой анонимной памяти (anonymous storage), В приведенном ниже примере создается ссылка на анонимный хэш, которая помещается в переменную $ahref. $ahref={ phone = лп, light => Эдисон }; Элементы анонимного хэша помещаются в фигурные скобки. Такая конструкция возвращает ссылку на созданный хэш, которую нужно присвоить Для работы с анонимным хэшем используется методика, описанная выше в разделе "Ссылки на хэши". Анонимный массив создается с помощью квадратных скобок [], как показано ниже на примере. $aaref=[ фг(яблоЕо агхсин банан кбник) ]; Для работы с анонимным массивом используется методика, описанная выше в разделе "Ссылки на массивы". Данные, на которые указывают переменные-ссылки, уничтожаются, как только соответствующая переменная-ссылка выходит из области видимости, как показано ниже на примере. my $ref; Sref=[ ди{0Ввсрсжы11НзиЕячьеть) ]; print $SreftO]; * Будет шгЕтавнэ "свес" print $$ref[0]; f СИкбка! leg&Bssa $£ef snra нз эоы шщлххли. 206 Часть И. углубляемся e Perl Следует отметить, что если в программе используется оператор use strict, то этот пример будет скомпилирован с ошибками. Причина заключается в том, что Perl считает переменную $ref глобальной, поскольку она используется в последнем операторе, ив то же самое время она объявлена локальной переменной блока, что недопустимо. Если же активизировать режим вьщачи предупреждений с помощью ключа -w, то, вероятнее всего, Perl выведет сообщение undefined value (неопределенное значение), даже если при этом не используется оператор use strict. Описанные выше анонимные хэши и массивы можно объединять в структуры данных, которые будут описаны в следующем разделе. Поскольку для хранения ссылок на хэши и массивы используются одиночные скалярные переменные, их без проблем можно поместить в элемент массива или хэша, как показано ниже на примере. ( рок 1ГП класгика ) ]; $Ь=[ qw( ашастика боенж даш J ]; $о[ qw{ ярип кБига газета ) ]; tinedia= (music => $а, Шт=> $b, print => $с); Примеры структур данных В следующих разделах будут примеры организации структур данных с помощью массивов и хэшей, которые чаще всего используются при программировании. Список СПИСКОВ, или двумерный массив Список списков в Perl часто используется для организации структуры данных, на- зываемой двумерным массивом. Как известно, обычный массив представляет собой линейный список значений, как показано ниже на рисунке.
Двумерный массив напоминает таблицу, содержащую строки и столбцы, в которой каждый элемент адресуется по номеру строки и столбца подобно координатам точки на плоскости. Первым в адресе элемента двумерного массива указывается номер строки (начиная с нуля), а вторым - номер столбца, как показано ниже.
В Perl не предусмотрено такого понятия, как многомерный массив. Зато по-. добную структуру данных легко создать с помощью массива ссылок на массивы. Ниже приведен пример создания массива массивов, элементы которого состоят из литералов. nist of Usts=( [ Ford Mercedes ) ], ({Toyota Mzda Mitsubishi) ], { qv( Peugeot Renault) ], Посмотрите внимательно на этот фрагмент кода. В нем создается обычный снисок list of lists, который состоит из ссылок на другие списки. Для доступа к отдельным элементам внутренних массивов (или ячеек двумерного массива) используется следующий фрагмент кода: $list of liets(0][l]; t "BJW, или 1-я строка -й эпв Slist of lists[ll[2]; ♦ "MitsuhLshi", иш 2-я стрска эгиент Методика определения количества элементов во внешнем списке ничем не отличается от той, которую мы применяли для массивов. Напомним, что речь идет о конструкции S* или об использовании имени массива в скалярном контексте, например: Stlist of lists; t следго злвзта Ссив f lists: 2 scalar (eiistof lists); I Число сцрок в :и lists: 3 Чтобы определить количество элементов во вложенных массивах, придется при-бегнугь к небольшой хитрости. Конструкция $list of JistsU] возвращает ссьшку на вторую строку "двумерного" массива Slist of lists. Если распечатать это значение, то вы получите нечто тина ARRAY(00000). Поэтому, чтобы элементы массива eiist of lists интерпретировались как вложенные массивы, при обращении к ним необходимо использовать знак §, как показано ниже на примере. scalar{ S{$li6t of lists[2]} ); f 3-я строка состоит из 2-х элементов 5#{$liBt of lists[l]); ♦ Помф последнего элемента во второй строке: 2 Для перебора всех элементов списка списков можно использовать следующий фрагмент кода: foreach my $oute of lists) { foreach ву Sinner ({Soiiter}) { print "$inner print "\n"; В список списков можно добавлять новые элементы и строки, как показано ниже на примере. t сцрска во eiu списке push(nist of listB, [ qw(Lexus liiiadiiGhevrDlet) ] ); f ПсЕый элемент в нервом вложенном списке push(*{Slisi of lists[OJ}, qw{Audi) ); 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 |