Глава 3: Массивы и списочные данные
3.4 Операции над массивами и функции обработки массивов
3.4.2 Обращение к элементам массива
До сих пор мы рассматривали массив в целом, добавляя и удаляя значения с помощью присваивания для массива. Многие полезные программы так и построены — с использованием массивов, но без обращения к их элементам. Perl, однако, предоставляет и традиционный способ обращения к элементам массива по их числовым индексам.
Элементы массива нумеруются последовательными целыми числами с шагом 1, начиная с нуля*. Первый элемент массива @fred обозначается как $fred[0]. Обратите внимание: при ссылке на элемент вместо знака @ в имени массива используется знак $ . Это объясняется тем, что обращение к элементу массива идентифицирует скалярную переменную (часть массива), которой в результате может быть присвоено значение или которая используется в выражении, например:
@fred = (7,8,9);
$b = $fred[0]; # присвоить $b значение 7 (первый элемент массива @fred)
$fred[0] = 5; # теперь @fred = (5,8,9)
Точно так же можно обращаться к другим элементам:
$с = $fred[l]; # присвоить $с значение 8
$fred[2]++; # инкрементировать третий элемент массива @fred
$fred[l] +=4; # прибавить 4 ко второму элементу
($fred[0],$fred[l]) = ($fred[l],$fred[0]); # поменять местами первые два элемента
* Значение индекса первого элемента можно изменить на что-нибудь другое (например, на "1"). Это, однако, повлечет за собой очень серьезные последствия: может запутать тех, кто будет сопровождать ваш код, и повредить программы, которые вы заимствуете у других. По этой причине настоятельно рекомендуем считать такую возможность отсутствующей.
Обращение к списку элементов одного массива (как в последнем примере) называется срезом" и встречается достаточно часто, поэтому для него есть специальное обозначение.
@fred[0,l] # то же, что и ($fred[0],$fred[l])
@fred[0,l] = @fred[l,0] # поменять местами первые два элемента
@fred[0,l,2] = @fred[l,l,l] # сделать все три элемента такими, как второй
@fred[l,2] = (9,10); # заменить последние два значения на 9 и 10
Обратите внимание: в этом срезе используется не $, а @. Это вызвано тем, что вы создаете переменную-массив (выбирая для этого часть массива), а не скалярную переменную (обращаясь к одному элементу массива).
Срезы работают также с литеральными списками и вообще с любой функцией, которая возвращает список:
@who = (qw(fred barney betty wilma))[2,3];
# как @х = qw(fred barney betty wilma);
@who = @x[2,3]
Значения индексов в этих примерах — литеральные целые, но индекс может быть и любым выражением, которое возвращает число, используемое затем для выбора соответствующего элемента:
@fred = (7,8,9);
$а = 2;
$b = $fred[$a]; # как $fred[2], 9
$с = $fred[$a-l]; # $c получает значение $fred[1], или 8
($с) = (7.8,9)
[$а-1]; # то же самое, но с помощью среза
Таким образом, обращение к массивам в Perl-программах может производиться так же, как во многих других языках программирования.
Идея использования выражения в качестве индекса применима и к срезам. Следует помнить, однако, что индекс среза — список значений, поэтому выражение представляет собой выражение-массив, а не скаляр.
$fred = (7,8,9); # как в предыдущем примере $barney =(2,1,0);
@backfred = @fred[@barney]; # то же, что и @fred[2,l,0], или
# ($fred[2],$fred[l],$fred[0]),
# или (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"; # @fred теперь имеет значение
# (1,2,3,"hi",undef,undef,"ho")
Присваивание значения элементу массива с индексом меньше нуля является грубой ошибкой, потому что происходит такое, скорее всего, из-за Очень Плохого Стиля Программирования.
Для получения значения индекса последнего элемента массива @fred можно использовать операцию $#fred. Можно даже задать это значение, чтобы изменить размер массива @fred, но это, как правило, не нужно, потому что размер массива увеличивается и уменьшается автоматически.
Использование отрицательного индекса означает, что следует вести обратный отсчет от последнего элемента массива. Так, последний элемент массива можно получить, указав индекс -1. Предпоследний элемент будет иметь индекс -2 и т.д. Например:
@fred = ("fred", "wilma", "pebbles", "dino");
print $fred(-1]; # выводит "dino"
print $#fred; # выводит 3
print $fred[$#fred]; # выводит "dino"
Назад | Вперед
Содержание (общее) | Содержание раздела | Содержание подраздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|