連想配列について
最近めっきり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のマニュアルを見れば書いてあるんですが、色々書いてあるわりに例示がやたらと少ないんです。↑は、私自身がいろいろ打ってみてわかったことのメモです。