連想配列について

最近めっきりzsh弄りしかやってないような気がして微妙に凹んでいるderuiです。

そして今回もzshのネタという。むぅ。

zshでは、配列と連想配列を利用することができます。
配列は、別に事前になにかすることなく、代入の際に()で括ることで表現できます。

set -A TEST
TEST=(1 2 3 4 5)
echo $TEST[1]  =>  1
echo "${TEST[2]} ${TEST[3]}"  => 2 3

TEST=(〜)の代わりに、typeset -a TEST 要素 要素... とする方法もあります。この場合、()で括る必要はなく、単純に要素を列挙するだけです。
ただし、要素間の区切りはスペースのみ(多分)ですので、そのへんを注意してください。

連想配列も同じような形で利用できますが、連想配列の場合はちゃんとzsh側で区別してもらう必要がありますので、typeset -Aが必須になります

typeset -A TEST
TEST=(a 1 b 2 c 3)
echo $TEST[a]  =>  1
echo "${TEST[a]} ${TEST[b]}" => 2 3

連想配列の場合、要素の個数が2の倍数である必要があり、かつ二つセットの内先頭がキーとして扱われる値になります。

ところで、上で出した二つの値は代入以外で添え字を利用していますが、添え字を指定しない場合、配列の場合は全要素がスペース区切りで、連想配列の場合には「キー以外の値」が出力されます。見た方が早いですね。他にも連想配列についての構文なんかも紹介しておきます。

TEST=(1 2 3 4 5)
echo $TEST => 1 2 3 4 5
typeset -A TEST
TEST=(a 1 b 2 c 3)
echo $TEST => 1 2 3

# 値を変更する
TEST[a]=100

echo $TEST => 100 2 3

# 配列、連想配列の個数を取得する
echo ${#TEST} => 3

# じゃあ連想配列のキーはどうやって取得する?
echo ${(k)TEST} => a b c

# 連想配列にペアを追加する
TEST+=(d e)
echo $TEST => 1 2 3 e
echo $TEST[d] => e

とまぁこんな感じです。typeset -A は、「代入の直前」に必要なだけで、追加に関しては必要ないようです。

ちなみに空配列を作成したい場合、set -A 変数名 ; 変数名=() で空配列が作成できます。

この辺は、zshのマニュアルを見れば書いてあるんですが、色々書いてあるわりに例示がやたらと少ないんです。↑は、私自身がいろいろ打ってみてわかったことのメモです。

zshは面白いんですが、ちとマニュアルが膨大過ぎる感が。読み切れませんて。