Zs साहचर्य सरणी में कुंजियों (या k / v जोड़े) पर फेरबदल करना?


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
टिमसुम

यह तब काम नहीं करता है जब कुंजियों या मूल्यों में रिक्त स्थान होता है
मैक्स कोपलान

30

मैंने अपना प्रश्न पूछने के बाद भी खोज जारी रखी और यूनिक्स 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
किसी के लिए भी यह एक उपयोगी तरीके से परीक्षण करना चाहते हैं, बिलिन के साथ प्रयास करें $options। (देखें man zshoptions)
mVChr

क्या होगा अगर कुंजी एक बढ़ती संख्या नहीं है जैसे कि फू, बार, आदि जैसे गिरफ्तारी [फू] = बाज?
टीमो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.