zsh連想配列のキー(または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
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
これを便利な方法でテストしたい人は、builtinを試してください$options。(参照man zshoptions
mVChr

キーがarr [foo] = bazのようなfoo、barなどのように増加する数字ではない場合はどうなりますか?
ティモ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.