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

массива в скалярном контексте.) Например, чтобы получить число на единицу меньшее, чем размер массива, можно использовать @fr jd-1, так как скалярная операция вычитания требует наличия скаляров в обеих частях. Обратите внимание на следующий пример:

$а = @fred; # переменной $а присваивается размер массива @fred ($а) = @fred; # переменной $а присваивается первый элемент @fred

Первое присваивание - скалярное, и массив @fred рассматривается как скаляр, поэтому значение переменной $а будет равно размеру массива. Второе присваивание - для массива (несмотря на то, что требуется всего одно значение), поэтому переменной $а в качестве значения присваивается первый элемент массива @fred, а остальные элементы просто отбрасываются.

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

gfred = (Obarney = (2,3,4)); # @fred и (ЗЬагпеу получают значения (2,3,4) @fred = (ЗЬагпеу = (2,3,4); # то же самое

Обращение к элементам массива

До сих пор мы рассматривали массив в целом, добавляя и удаляя значения с помощью присваивания для массива. Многие полезные программы так и построены - с использованием массивов, но без обращения к их элементам. Peri, однако, предоставляет и традиционный способ обращения к элементам массива по их числовым индексам.

Элементы массива нумеруются последовательными целыми числами с шагом 1, начиная с нуля*. Первый элемент массива @f red обозначается как $fred[0]. Обратите внимание: при ссылке на элемент вместо знака @ в имени массива используется знак $. Это объясняется тем, что обращение к элементу массива идентифицирует скалярную перементгую (часть массива), которой в результате может быть присвоено значение или которая используется в выражении, например:

(afred = (7,8,9);

5b = $fred[0]; # присвоить $Ь значение 7 (первый элемент массива (3fred) 5fred[01 =5; # теперь (afred = (5,8,9)

Точно так же можно обращаться к другим элементам:

$с = $fred[l]; # присвоить $с значение В

$fred[2]+ + ; # инкрементировать третий элемент массива (3fred

$fred[l] +=4; # прибавить 4 ко второму элементу (5fred[0],$fred[ll) = ($fred[1],5fred[О]) ;

# поменять местами первые два элемента

Значение индекса первого элемента можно изменить на что-нибудь другое (например, на "1"). Это, однако, повлечет за собой очень серьезные последствия; может запутать тех, кто будет сопровождать ваш код, и повредить программы, которые вы заимствуете у других. По этой причине настоятельно рекомендуем считать такую возможность отсутствующей.



Обращение к списку элементов одного массива (как в последнем примере) называется срезом* и встречается достаточно часто, поэтому для него есть специальное обозначение.

@fred[0,l] # тоже, что и ($fred[О],$fred[1])

@fred[0,1] = @fred[1,0] # поменять местами первые два элемента

@fred[0,l,2] = @fred[l,l,l] # сделать все три элемента такими, как второй @fred[l,2] = (9,10); # заменить последние два значения на 9 и 10

Обратите внимание- в этом срезе используется не $, а @. Это вызвано тем, что вы создаете переменную-массив (выбирая для этого часть массива), а не скалярную переменную (обращаясь к одному элементу массива).

Срезы работают также с литеральными списками и вообще с любой функцией, которая возвращает список:

Qvho = (qw(fred barney betty wilma)) [2, 3] ;

# как @x = qw(fred barney betty wilma); @who = @x[2,3]

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

@fred = (7,8, 9) ; $а = 2;

$Ь = $fred[$a]; # как $fred[2], или 9

$с = $fred[$a-l]; # $с получает значение $fred[l], или 8

($с) = (7,8,9)[$а-11; # то же самое, но с помощью среза

Таким образом, обращение к массивам в Perl-программах может производиться так же, как во многих других языках программирования.

Идея использования выражения в качестве индекса применима и к срезам. Следует помнить, однако, что индекс среза - список значений, поэтому выражение представляет собой выражение-массив, а не скаляр.

@fred = (7,8,9); # как в предыдущем примере еЬагпеу = (2,1,0); @backfred = @fred[ЭЬагпеу],

# то же, что и @fred[2,1,0], или ($fred[2],$fred[1],$fred[О]), или (9,8,7)

Если обратиться к элементу, находящемуся за пределами массива (т.е. задав индекс меньще нуля или больще индекса последнего элемента), то возвращается значение undef. Например:

@fred = (1,2,3);

$barney = $fred[7]; # $barney теперь имеет значение undef

Это перевод английского термина slice, использованный в данной книге Более точно суть операции можно было бы выразить термином вырезка, но мы остановились на слове срез, чтобы не вызывать гастрономических ассоциаций у любителей мясных блюд - Прим ред.



Присваивание значение элементу, находящемуся за пределами текущего массива, автоматически расширяет его (с присваиванием всем промежуточным значениям, если таковые имеются, значения undef). Например;

@fred = (1,2,3);

fred[3] = "hi"; # @fred теперь имеет значение (1,2,3,"hi") $fred[6] = "ho"; # gfred теперь имеет значение

# (1,2,3,"hi",undef,undef,"ho")

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

Для получения значения индекса последнего элемента массива (afred можно использовать операцию $#fred. Можно даже задать это значен!гс, чтобы изменить размер массива @fred, но это, как правило, не нужно, потому что размер массива увеличивается и уменьшается автоматически.

Использование отрицательного индекса означает, что следует вести обратный отсчет от последнего элемента массива. Так, последний элемент массива можно получить, указав индекс -1. Предпоследний элемент будет иметь индекс -2 и т.д. Например:

(afred = ("fred", "wilma", "pebbles", "dino");

print $fred[-l]; # выводит "dino"

print 5#fred; # выводит 3

print Sfred[.?#fred] ; # выводит "dino"

Функции push и pop

Одним из распространенных вариантов использования массива является создание стека данных, где новые значения вводятся и удаляются с npaBoii стороны списка. Эти операции применяются довольно часто, поэтому лля них предусмотрены специальные функции:

push(gmylist,Snewvalue); # означает gmylist = (@mylist,$newvalue) $oldvalue = pop (.$myli3t) ; # удаляет последний элемент из I3mylist

Если в функцию pop введен пустой список, она возвращает undef, не выдавая, в соответствии с принятым в Perl этикетом, никакого предупреждающего сообщения.

Функция push также принимает список значений, подлежащих помещению в стек. Эти значения вводятся в конец списка. Например:

@mylist = (1,2,3);

push (@mylist, 4, 5, 6) ; # I3mylist= (1,2,3,4,5,6)

Отметим, что первый аргумент должен быть именем переменной-массива, потому что для литеральных списков функции push и pop смысла не имеют.

М<1 сииы и стк-очимс <)(iiinhir 83



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