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?


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.


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.