LINUX.ORG.RU

Обычные массивы BASH - на самом деле ассоциативные?

 ,


1

1
declare  -a arr_=([0]=31 [31]=2 [1257]=87)
declare -p arr_
echo ${#arr[*]}
echo ${#arr[@]}

Действительно ли реализация обычных массивов в BASH - это по сути тот же хэш, только слегка «завуалированный»?
В таком случае получается, что ассоциативные массивы (точнее, векторы) в BASH всегда были, просто до 4-й версии существовало ограничение на формат «ключей»?

★★★★★

Ответ на: комментарий от derlafff

Хотя надо смотреть, нвверняка там все не так просто. Почему, например, поддержка нормальных ключей появилась только совсем недавно?

derlafff ★★★★★
()
Ответ на: комментарий от derlafff

Ну, может, хэш-функции как таковой и не было, а был прямой перебор вектора, содержащего «индексы». То есть использовался служебный вектор, каждый элемент которого содержал псевдо-индекс, а номер элемента вектора служил для доступа к собственно элементу массива. А сейчас они осилили ещё и хэш-функции - может, кому-то из разработчиков в школе начали алгоритмы из книжки Кнутта преподавать :)

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

И до сих пор (bash 4.2.45) «обычные» массивы реализованы двусвязным списком, в каждом элементе которого хранится целочисленный индекс и ссылка на строку-значение, а в «голове» общее количество элементов.
Ассоциативные массивы на самом деле в хэш-таблице.
Объединение тех и других одним механизмом реализации было бы несложно, но оно сломает поведение «${a[-1]}» для «индексированных» массивов. Впрочем, если бы использовали не хэш, а какое-либо дерево, то всё было бы в порядке.

ABW ★★★★★
()

BASH это такой PHP, только много хуже.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.