Iterando sobre chaves (ou pares k / v) na matriz associativa zsh?

23

No zsh, quero iterar sobre uma matriz associativa. Eu preciso de chaves e valores. Mas quando eu itero sobre a matriz associativa normalmente ( for x in $assoc_array), recebo apenas valores.

Todos os exemplos que eu observei mostram que, dada uma chave , você pode obter seu valor de uma matriz associativa. Meu problema é obter o conjunto de chaves para começar.

O zsh suporta a iteração sobre chaves em uma matriz associativa?

Philip
fonte
Se você tiver apenas uma pequena lista esta pode ser uma opção:for i in a,b c_s,d ; do KEY=${i%,*}; VAL=${i#*,}; echo $KEY" XX "$VAL; done
matemática

Respostas:

12

Você pode obter chaves e valores de uma vez com esta expansão de parâmetro bacana:

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

Consulte Sinalizadores de expansão de parâmetros no manual do Zsh.

Radon Rosborough
fonte
Isto é muito mais simples +1
TimSum
Isso não funciona quando as chaves ou valores têm espaços neles
Max Coplan 9/09
30

Continuei pesquisando depois de fazer minha pergunta e encontrei esta resposta no 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

A saída é:

k1 -> v1
k2 -> v2
k3 -> v3
Philip
fonte
1
Para quem quiser testar isso de uma maneira útil, tente com o builtin $options. (Veja man zshoptions)
mVChr
E se a chave não for um número crescente, como foo, bar, etc, como arr [foo] = baz?
Timo