Народ, чего-то я или не понимаю, или туплю. Вот такой пример на bash'е:
#!/bin/bash
# Создаём обычный индексированный массив
one=("a" "b" "c" "d")
# Объявляем ассоциативный массив
declare -A two
# В новом массиве в качестве ключей и значений
# используем значения из исходного массива
for i in "${one[@]}"
do
two["$i"]="$i"
done
# Выводим список ключей
echo "${!two[@]}"
# Выводим содержимое нового массива
echo "${two[@]}"
Выхлоп:
d c b a d c b a
Эффект для меня неожиданный: в новом массиве элементы оказываются расположены в обратном порядке, то есть при добавлении нового элемента в ассоциативный массив он кладётся не в конец, после предыдущего, а в начало — перед ним! Или я что-то делаю не так, или у меня глаза на жопе, или это нигде внятно не описано, потому что ассоциативные массивы во всяких пособиях обычно упоминают скороговоркой, в man bash про порядок ключей ассоциативного массива тоже кажется ни слова.
И чё с этим делать и как с этим бороться с наименьшими затратами? А именно, когда хочется получить список именно в ожидаемом порядке по возрастанию, а не наоборот.
Tags:
no subject
no subject
А легкий гуглеж выдает: "порядок, в котором значения кодируются в ассоциативном массиве, не обязательно должен совпадать с порядком, в котором они отображаются"
no subject
А вы попробуйте выбрать последовательно все элементы такого массива. Окажется, что какой-то порядок должен быть. Кроме того, в баше массив — это в общем-то просто текстовая строка, в которой какие-то значащие наборы символов разделены пробельными символами. А такая строка — это всегда определённая последовательность. В баше есть только одномерные массивы и часто для всяких трюков используются не значения, а именно ключи, и их порядок может иметь значение.
no subject
Порядок (читай: отношение порядка) "правой стороны" хэш-отображения -- дело интуитивно непредсказуемое.
no subject
no subject
Есть такое дело
Однако:
---------8><------------
#!/bin/bash # Создаём обычный индексированный массив one=("a" "b" "c" "d") # Объявляем ассоциативный массив declare -A two # В новом массиве в качестве ключей и значений # используем значения из исходного массива for i in "${one[@]}" do two["$i"]="$i" done # Выводим список ключей echo "${!two[@]}" # Выводим содержимое нового массива echo "${two[@]}" #------------------------------------ # # THE SOLUTION: # for k in $(for k in "${!two[@]}"; do echo $k; done | sort); do echo "two[$k] = ${two[$k]}" done---------8><------------Ну, и не забываем, что sort (http://citforum.ru/operating_systems/manpages/SORT.1.shtml) умеет много гитик ;-)
Re: Есть такое дело
Re: Есть такое дело
ЗЫ Для продвинутого скриптинга я бы рекомендовал Tcl (https://tcl.tk/) (LISP-вдохновенный шелл) или newLISP (http://www.newlisp.org/) (это вообще мега-жемчужина, катастрофически недооцениваемая б***-массами, самый "человечный" и быстрейший в мире "честный" интерпретатор ЛИСПа).
Re: Есть такое дело
Тут ведь от назначения и возможного применения много зависит. Одно дело когда можешь тянуть какие хочешь зависимости, другое — когда дай бог чтобы хотя бы coreutils стояли.
Re: Есть такое дело
Перше. Сам Тикль. Во времена моей молодости он был во всех дистрах "из коробки". Насколько я в курсе, его и сейчас можно, скажем, в Buildroot (система сборки Linux-"прошивок" на конкретную платформу -- роутеры там, кофеварки, жужжалки для ж... -- попросту говоря: большой набор Make-файлов) включением одной галочки в menuconfig заиметь. Ему (как и newLISP'у) для портирования не нужно ничего, кроме компилятора Ц и его стандартной библиотеки.
Друге. Надстройки над сабжем -- Tk (произносится "Тики" -- иксовые виджеты с машиной событий -- кстати, canvas там просто ох... какой виджет!), expect ("консольная" надстройка над Тиклем для автоматизации запуска консольных же программ), а тако ж "толстый-толстый слой" надстроек уже над ымы обоими. Тут уже "пробовать надо" (ц), в смысле: никаких гарантий нет (хотя, если в коробке есть Иксы, то и Тк скорее всего будет, хотя бы как опция).
Re: Есть такое дело
Re: Есть такое дело
Навскидку предположу, что в "среднедесктопных" дистрах есть во всех, по крайней мере ядро языка (tclsh/wish).
В худшем случае портируется, опять же, с минимумом приседаний.
ЗЫ Тётя Вика: Tcl входит практически во все дистрибутивы Linux (https://ru.wikipedia.org/wiki/Tcl).
ЗЫ На случай внезапного "пощупать"
Для первоначального введения советую нагуглить уроки от кого-то из отечественных красноглазиков 90-х.
После чего современные версии (с хэш-таблицами и прочим сахаром) нечувствительно раскуриваются по http://tcl.tk/doc .
RE: Re: Есть такое дело
Вон, сделать один массив ключей и еще один - значений в том же самом порядке, да и всё.
ONE=(ключи тута)
TWO=(значения тута)
Цикл от нуля до длины массива-1, читаем что нужно из ONE и TWO. Чтобы вам реально была нужна скорость доступа O(1), это нужно очень много, десятки тысяч элементов, иначе - и последовательный доступ сойдет.
Hashes, как все прочие комментаторы написали, не бывают ordered по самому определению данного алгоритма. Ordered бывают массивы и деревья. Пытаться городить массив неких структур данных, равно как и деревья на, прости Господи, баше - "ну такое".
Рассказ о TCL - это интересно, да. На дворе же нынче 1987-й и на рынке труда полно знающих и желающих написанное на нем поддерживать.
Perl, Python3, Lua - в таком примерно направлении смотреть, если очень нужно.
Re: Есть такое дело
> Perl, Python3, Lua
Если вы с такой иронией по поводу немодных штучек, то вы тогда тоже не в трендах. И PERL нынче это тоже для старпёров, да и Lua кажется тихо вымирает. Кругом сплошной Python, но реально модно и молодёжно вычислять 2*2 на Javascript и не иначе как на Электроне.
Re: Есть такое дело
Именно что нужно что-то такое, что встанет из стандартного для данного вида линукса пакадж-менеджера, не потянув при этом за собой всякую хрень, NetworkManager и gnome-desktop.
Re: Есть такое дело
Не то что бы я спешил броситься в объятья TCL, но у вас ключевое слово — рынок. А я дилетант и чайник со свистком, который понемногу чего-то пытается для себя, для души пробовать. На очень пионерском уровне. Мне не надо торговать фейсом и изо всех сил доказывать, что я всё ещё чего-то стоящая проститутка, а не просто потасканная девка. Поэтому в выборе средств и видов извращений не ограничен.
> Пытаться городить массив неких структур данных, равно как и деревья на, прости Господи, баше - "ну такое".
Не, ну понятно что какую-нить 1С бхгалтерию на баше сочинять было бы несколько бессмысленно — хотя, наверное, теоретически возможно. А вот когда задача стоит запустить какую-то утилиту(ы) — тут первым делом мысль, естественно, возникает, что это административная задача для оболочки. Но бывает, что оные утилиты находятся в замысловатой связи друг с другом и требуют некоторых структурированных данных. И тут вопрос философский — нужна ли для этого тяжёлая артиллерия и насколько.
Re: Есть такое дело
---------8><----------
!#/usr/bin/wish button .b -text "Превед" -command {puts "Пока, козлы!"; exit} pack .b---------8><----------Теперь то же самое на "этих ваших", плз ;-)
Re: Есть такое дело
Re: Есть такое дело
Re: Есть такое дело
Re: Есть такое дело
no subject
no subject