¿Iterando sobre claves (o pares k / v) en una matriz asociativa zsh?

23

En zsh, quiero iterar sobre una matriz asociativa. Necesito claves y valores. Pero cuando itero sobre la matriz asociativa normalmente ( for x in $assoc_array), obtengo solo valores.

Todos los ejemplos que he visto muestran que, dada una clave , puede obtener su valor de una matriz asociativa. Mi problema es obtener el conjunto de claves para empezar.

¿Soporta zsh iterar sobre claves en una matriz asociativa?

Philip
fuente
Si solo tiene una pequeña lista, esta podría ser una opción:for i in a,b c_s,d ; do KEY=${i%,*}; VAL=${i#*,}; echo $KEY" XX "$VAL; done
matemáticas

Respuestas:

12

Puede obtener claves y valores a la vez con esta ingeniosa expansión de parámetros:

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

Consulte Indicadores de expansión de parámetros en el manual de Zsh.

Radon Rosborough
fuente
Esto es mucho más simple +1
TimSum
Esto no funciona cuando las claves o valores tienen espacios en ellos
Max Coplan
30

Continué buscando después de hacer mi pregunta y encontré esta respuesta en el 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

Salida es:

k1 -> v1
k2 -> v2
k3 -> v3
Philip
fuente
1
Para cualquiera que quiera probar esto de una manera útil, intente con el incorporado $options. (Ver man zshoptions)
mVChr
¿Qué pasa si la clave no es un número creciente como foo, bar, etc. como arr [foo] = baz?
Timo