साहचर्य सरणियों के साथ गोले
कुछ आधुनिक गोले साहचर्य सरणियाँ प्रदान करते हैं: ksh93, bash z4, zsh। Ksh93 और bash में, यदि a
एक सहयोगी सरणी है, तो "${!a[@]}"
इसकी कुंजियों का सरणी है:
for k in "${!a[@]}"; do
echo "$k -> ${a[$k]}"
done
Zsh में, वह सिंटैक्स केवल ksh इम्यूलेशन मोड में काम करता है। अन्यथा आपको zsh के मूल सिंटैक्स का उपयोग करना होगा:
for k in "${(@k)a}"; do
echo "$k -> $a[$k]"
done
${(k)a}
a
खाली कुंजी नहीं होने पर भी काम करता है।
Zsh में, आप एक ही समय में k
eys और v
alues दोनों पर लूप कर सकते हैं :
for k v ("${(@kv)a}") echo "$k -> $v"
साहचर्य सरणियों के बिना गोले
गोले में साहचर्य सरणियों का अनुकरण करना जो उनके पास नहीं है वह बहुत अधिक काम है। यदि आपको साहचर्य सरणियों की आवश्यकता है, तो संभवतः यह एक बड़ा उपकरण लाने का समय है, जैसे ksh93 या पर्ल।
यदि आपको केवल POSIX शेल में सहयोगी सरणियों की आवश्यकता है, तो उन्हें अनुकरण करने का एक तरीका है, जब कुंजियों को केवल वर्ण 0-9A-Z_a-z
(ASCII अंक, अक्षर और अंडरस्कोर) शामिल करने के लिए प्रतिबंधित किया जाता है । इस धारणा के तहत, चर नाम के भाग के रूप में कुंजियों का उपयोग किया जा सकता है। नीचे दिए गए कार्य एक नामकरण उपसर्ग, "स्टेम" द्वारा पहचाने गए सरणी पर कार्य करते हैं, जिसमें लगातार दो अंडरस्कोर नहीं होना चाहिए।
## ainit STEM
## Declare an empty associative array named STEM.
ainit () {
eval "__aa__${1}=' '"
}
## akeys STEM
## List the keys in the associatve array named STEM.
akeys () {
eval "echo \"\$__aa__${1}\""
}
## aget STEM KEY VAR
## Set VAR to the value of KEY in the associative array named STEM.
## If KEY is not present, unset VAR.
aget () {
eval "unset $3
case \$__aa__${1} in
*\" $2 \"*) $3=\$__aa__${1}__$2;;
esac"
}
## aset STEM KEY VALUE
## Set KEY to VALUE in the associative array named STEM.
aset () {
eval "__aa__${1}__${2}=\$3
case \$__aa__${1} in
*\" $2 \"*) :;;
*) __aa__${1}=\"\${__aa__${1}}$2 \";;
esac"
}
## aunset STEM KEY
## Remove KEY from the associative array named STEM.
aunset () {
eval "unset __aa__${1}__${2}
case \$__aa__${1} in
*\" $2 \"*) __aa__${1}=\"\${__aa__${1}%%* $2 } \${__aa__${1}#* $2 }\";;
esac"
}
(चेतावनी, अनुपयोगी कोड। वाक्य-रचना के अमान्य तनों और कुंजियों के लिए त्रुटि का पता लगाने की अनुमति नहीं दी गई है।)