Itération sur les clés (ou paires k / v) dans le tableau associatif zsh?

23

Dans zsh, je veux parcourir un tableau associatif. J'ai besoin à la fois de clés et de valeurs. Mais lorsque j'itère normalement le tableau associatif ( for x in $assoc_array), je n'obtiens que des valeurs.

Tous les exemples que j'ai examinés montrent que, étant donné une clé , vous pouvez obtenir sa valeur à partir d'un tableau associatif. Mon problème est d'obtenir le jeu de clés pour commencer.

Zsh prend-il en charge l'itération sur les clés d'un tableau associatif?

Philippe
la source
Si vous n'avez qu'une petite liste, cela pourrait être une option:for i in a,b c_s,d ; do KEY=${i%,*}; VAL=${i#*,}; echo $KEY" XX "$VAL; done
math

Réponses:

12

Vous pouvez obtenir à la fois les clés et les valeurs avec cette extension de paramètre astucieuse:

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

Voir Indicateurs d'extension de paramètre dans le manuel Zsh.

Radon Rosborough
la source
C'est beaucoup plus simple +1
TimSum
Cela ne fonctionne pas lorsque les clés ou les valeurs contiennent des espaces
Max Coplan
30

J'ai continué à chercher après avoir posé ma question et j'ai trouvé cette réponse sur 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

La sortie est:

k1 -> v1
k2 -> v2
k3 -> v3
Philippe
la source
1
Pour toute personne souhaitant tester cela de manière utile, essayez avec la fonction intégrée $options. (Voir man zshoptions)
mVChr
Et si la clé n'est pas un nombre croissant comme foo, bar, etc. comme arr [foo] = baz?
Timo