วนซ้ำคีย์ (หรือคู่ k / v) ในอาร์เรย์ที่เชื่อมโยง zsh หรือไม่


23

ใน zsh ฉันต้องการวนซ้ำแถวที่เชื่อมโยงกัน ฉันต้องการทั้งกุญแจและค่า แต่เมื่อฉันวนซ้ำแถวเชื่อมโยงตามปกติ ( for x in $assoc_array) ฉันจะได้รับเฉพาะค่า

ตัวอย่างทั้งหมดที่ฉันได้ดูแสดงว่าได้รับคีย์คุณสามารถรับค่าของมันจากอาร์เรย์ที่เชื่อมโยง ปัญหาของฉันคือการได้รับชุดของคีย์เพื่อเริ่มต้นด้วย

zsh รองรับการวนซ้ำคีย์ในอาร์เรย์ที่เชื่อมโยงหรือไม่


หากคุณมีรายการเล็ก ๆ นี่อาจเป็นตัวเลือก:for i in a,b c_s,d ; do KEY=${i%,*}; VAL=${i#*,}; echo $KEY" XX "$VAL; done
คณิตศาสตร์

คำตอบ:


12

คุณสามารถรับทั้งคีย์และค่าพร้อมกันด้วยการขยายพารามิเตอร์ที่ดี:

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

ดูพารามิเตอร์การขยายธงในคู่มือ Zsh


วิธีนี้ง่ายกว่า +1
TimSum

สิ่งนี้ไม่ทำงานเมื่อคีย์หรือค่ามีช่องว่างอยู่ในนั้น
Max Coplan

30

ฉันค้นหาต่อหลังจากถามคำถามของฉันและพบคำตอบนี้ใน 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

ผลลัพธ์คือ:

k1 -> v1
k2 -> v2
k3 -> v3

1
สำหรับคนที่ต้องการที่จะทดสอบนี้ในทางที่เป็นประโยชน์ลองกับ $optionsbuiltin (ดูman zshoptions)
mVChr

ถ้าคีย์ไม่ใช่จำนวนที่เพิ่มขึ้นเช่น foo, bar และอื่น ๆ เช่น arr [foo] = baz?
Timo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.