Глава 3: Массивы и списочные данные
3.4 Операции над массивами и функции обработки массивов
3.4.1 Присваивание
Вероятно, самая важная операция, проводимая над массивами - операция присваивания, посредством которой переменной-массиву присваивается значение. Эта операция, как и скалярная операция присваивания, обозначается знаком равенства. Perl определяет тип присваивания (скалярное или для массива), анализируя, какой переменной присваивается значение — скалярной или массиву. Например:
@fred = (1,2,3); # массив fred получает трехэлементное литеральное значение
@barney = @fred; # теперь оно копируется в @barney
Если переменной-массиву присваивается скалярное значение, оно становится единственным элементом этого массива:
@huh =1; #1 автоматически становится списком (1)
Имена переменных-массивов могут входить в списочный литерал. При вычислении значений такого списка Perl заменяет имена массивов текущими значениями, например:
@fred = qw(one two);
@barney = (4,5,@fred,6,7) ; # @barney превращается в (4,5,"one","two",6,7)
@barney = (8,@barney); # в начале списка элементов @barney ставится 8
# и "last" в конце:
@barney = (@barney,"last") ; # @barney превращается в
# (8,4,5,"one","two",6,7,"last")
Отметим, что вставленные подобным образом элементы массива находятся на том же уровне иерархии, что и остальная часть литерала: список не может содержать другой список в качестве элемента*.
* Хотя ссылка на список и может быть элементом списка, на самом деле это не означает использование списка в качестве элемента другого списка. Впрочем, работает это почти так же, что позволяет создавать многомерные массивы.См.главу 4 книги Programming Perl и man-страницу perllol( I).
Если списочный литерал содержит только ссылки на переменные (а не выражения), то этот литерал также можно рассматривать как переменную. Другими словами, такой списочный литерал можно использовать в левой части операции присваивания. Каждая скалярная переменная в списочном литерале принимает соответствующее значение из списка, стоящего в правой части операции присваивания. Например:
($а,$b,$с) = (1,2,3); # присвоить 1 переменной $а, 2 — переменной $b,
# 3 — переменной $с
($a,$b) = ($b,$a); # поменять местами $а и $b
($d,@fred) = ($a,$b,$c) # присвоить $d значение $а, a @fred — значение ($b,$с)
($e,@fred) = @fred; # переместить первый элемент массива @fred
# в переменную $е. В результате @fred = ($с),
# а $е = $b
Если число присваиваемых элементов не соответствует числу переменных, то лишние значения (стоящие справа от знака равенства) просто отбрасываются, а все лишние переменные (слева от знака равенства) получают значение undef.
Переменная-массив, входящая в литеральный список, должна стоять в нем последней, потому что переменные-массивы очень "прожорливы" и поглощают все оставшиеся значения. (Конечно, после нее можно поставить и другие переменные, но всем им будет присвоено значение undef.)
Если переменная-массив присваивается скалярной переменной, то присваиваемое число является размером массива, например:
@fred = (4,5,6); # инициализация массива @fred
$а = @fred; # $а получает значение 3, текущий размер массива @fred
Размер возвращается и в том случае, если имя переменной-массива используется там, где должно быть скалярное значение. (В разделе "Скалярный и списочный контексты" мы увидим, что это называется использованием имени массива в скалярном контексте.) Например, чтобы получить число на единицу меньшее, чем размер массива, можно использовать @fred-l, так как скалярная операция вычитания требует наличия скаляров в обеих частях. Обратите внимание на следующий пример:
$а = @fred; # переменной $а присваивается размер массива @fred
($а) = @fred; # переменной $а присваивается первый элемент @fred
Первое присваивание — скалярное, и массив @fred рассматривается как скаляр, поэтому значение переменной $а будет равно размеру массива. Второе присваивание — для массива (несмотря на то, что требуется всего одно значение), поэтому переменной $а в качестве значения присваивается первый элемент массива @fred, а остальные элементы просто отбрасываются.
В результате выполнения присваивания для массива мы получаем значение, представляющее собой список. Это позволяет делать "каскадиро-вание". Например:
@fred = (Qbarney = (2,3,4)); # @fred и @barney получают значения (2,3,4)
@fred = @barney = (2,3,4); # то же самое
Назад | Вперед
Содержание (общее) | Содержание раздела | Содержание подраздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|