Ітерація над ключами (або парами k / v) в асоціативному масиві zsh?


23

У zsh я хочу перебрати асоціативний масив. Мені потрібні і ключі, і значення. Але коли я повторюю асоціативний масив ( for x in $assoc_array), я отримую лише значення.

Усі приклади, які я переглянув, показують, що, задавши ключ , ви можете отримати його значення з асоціативного масиву. Моя проблема - це набір ключів для початку.

Чи підтримує zsh ітерацію над ключами в асоціативному масиві?


Якщо у вас є лише невеликий список, це може бути варіант:for i in a,b c_s,d ; do KEY=${i%,*}; VAL=${i#*,}; echo $KEY" XX "$VAL; done
математика

Відповіді:


12

Ви можете отримати і ключі, і значення одразу за допомогою цього чудового розширення параметра:

for key val in ${(kv)assoc_array}; do
    echo "$key -> $val"
done

Дивіться Прапори розширення параметрів у посібнику Zsh.


Так простіше +1
TimSum

Це не працює, коли в ключах або значеннях є пробіли
Макс Коплан,

30

Я продовжив пошук, поставивши запитання, і знайшов цю відповідь на Unix StackExchange:

typeset -A assoc_array
assoc_array=(k1 v1 k2 v2 k3 v3)

for k in "${(@k)assoc_array}"; do
  echo "$k -> $assoc_array[$k]"
done

Вихід:

k1 -> v1
k2 -> v2
k3 -> v3

1
Для тих, хто хоче перевірити це корисним способом, спробуйте вбудувати $options. (Див. man zshoptions)
mVChr

Що робити, якщо ключ не збільшує кількість, як foo, bar тощо, як arr [foo] = baz?
Тимо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.