Руководство пользователя для GNU Awk
11. Массивы в awk
11.1 Введение в массивы
Язык awk обеспечивает одноразмерные массивы для хранения групп цепочек или чисел. Каждый массив awk должен иметь имя. Имена массивов имеют тот же синтаксис, что и имена переменных; каждое правильное имя переменной может быть также правильным именем массива. Но нельзя одно и то же имя использовать обоими способами (как массив и как переменную) в одной awk-программе.
Массивы в awk поверхностно сходны с массивами в других языках; но имеются и фундаментальные отличия. В awk не нужно указывать размер массива перед началом его использования. Кроме того, любое число или цепочка могут использоваться как индекс массива, а не только последовательные целые. В большинстве других языков нужно объявлять массив и указывать, сколько элементов, или компонент, он содержит.
В таких языках объявление отводит непрерывный блок памяти для указанного количества элементов. Индекс в массиве обычно обязан быть положительным целым; например, индекс ноль указывает первый элемент массива, который фактически хранится в начале блока памяти.
Индекс один указывает второй элемент, который располагается в памяти сразу после первого элемента, и т.д. Невозможно добавить больше элементов к массиву, потому что он имеет место только для объявленного количества элементов. (Некоторые языки допускают произвольные начальные и конечные индексы, например, `15 .. 27', но размер массива все равно фиксирован при его объявлении.) Непрерывный массив с четырьмя элементами: восемь, "foo", "" и 30: может выглядеть так:
8 "foo" "" 30 значения
0 1 2 3 индексы
Хранятся в памяти только значения; индексы неявно зависят от порядка значений. восемь есть значение с индексом ноль, потому что восемь появляется в позиции с нулем элементов перед ним. Массивы в awk не такие: они ассоциативны. Это значит, что каждый массив есть собрание пар: индекс и соответствующий ему элемент-значение:
Элемент 4 Значение 30
Элемент 2 Значение "foo"
Элемент 1 Значение 8
Элемент 3 Значение ""
Мы перечислили пары в случайном порядке, потому что их порядок безразличен. Одно из преимуществ ассоциативных массивов состоит в том, что новые пары можно добавлять в любой момент. Например, предположим, что мы добавляем к предыдущему массиву десятый элемент со значением "number ten". Результат получится такой:
Элемент 10 Значение "number ten"
Элемент 4 Значение 30
Элемент 2 Значение "foo"
Элемент 1 Значение 8
Элемент 3 Значение ""
Этот массив разрежен, так как некоторые индексы пропущены: имеются элементы 1-4 и 10, но нет элементов 5, 6, 7, 8 и 9.
Другое следствие ассоциативности массивов есть то, что индексы не обязаны быть положительными целыми. Любое число или даже цепочка может быть индексом. Например, вот массив, который переводит слова с английского на французский язык:
Элемент "dog" Значение "chien"
Элемент "cat" Значение "chat"
Элемент "one" значение "un"
Элемент 1 Значение "un"
Здесь мы решили переводить число один сразу и в произносимой и в числовой форме, иллюстрируя тот факт, что один массив может иметь и числа и цепочки в качестве индексов. (Но фактически индексы массивов всегда цепочки; Это в деталях обсуждается в разделе 11.7 [Использование чисел для индексов в массивах], стр. 129.)
Значение IGNORECASE никак не связано с индексацией массивов. Нужно употреблять точно те же самые строковые значения для выборки элементов из массива, которые использовались при его записи в массив.
Когда awk создает для вас массив, например, с помощью встроенной функции split, индексами этого массива становятся последовательные целые, начиная с единицы. (См. раздел 12.3 [Встроенные функции для действий с цепочками], стр. 137.)
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|