Iterasi kunci (atau pasangan k / v) dalam array asosiatif zsh?

23

Di zsh, saya ingin beralih di atas array asosiatif. Saya membutuhkan kunci dan nilai. Tetapi ketika saya beralih pada array asosiatif secara normal ( for x in $assoc_array), saya hanya mendapatkan nilai.

Semua contoh yang saya lihat di acara itu, diberikan kunci , Anda bisa mendapatkan nilainya dari array asosiatif. Masalah saya adalah memulai set kunci.

Apakah zsh mendukung pengulangan tombol pada array asosiatif?

Philip
sumber
Jika Anda hanya memiliki daftar kecil ini mungkin pilihan:for i in a,b c_s,d ; do KEY=${i%,*}; VAL=${i#*,}; echo $KEY" XX "$VAL; done
matematika

Jawaban:

12

Anda bisa mendapatkan kunci dan nilai sekaligus dengan perluasan parameter yang bagus ini:

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

Lihat Bendera Ekspansi Parameter di manual Zsh.

Radon Rosborough
sumber
Ini adalah cara yang lebih sederhana +1
TimSum
Ini tidak berfungsi ketika kunci atau nilai memiliki spasi di dalamnya
Max Coplan
30

Saya terus mencari setelah menanyakan pertanyaan saya dan menemukan jawaban ini di 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

Output adalah:

k1 -> v1
k2 -> v2
k3 -> v3
Philip
sumber
1
Bagi siapa pun yang ingin menguji ini dengan cara yang bermanfaat, coba dengan builtin $options. (Lihat man zshoptions)
mVChr
Bagaimana jika kuncinya bukan angka yang bertambah seperti foo, bar, dll seperti arr [foo] = baz?
Timo