読者です 読者をやめる 読者になる 読者になる

zsh だと連想配列がイケル

tech shellscript zsh

だけど,というお話.

zshでは、配列と連想配列を利用することができます。

というのを知ってときめいた.

ところが 1 要素の値に半角スペースが入っている時の扱い方がわからない.
もうちょっと調べなくちゃ...
もし正しい使い方ご存知の方,ご覧になってらしたら,是非ツッコミを入れて頂けるとしあわせです.

zsh での連想配列 associative array

参照先を見ていただくのが正しいのでしょうが,消えて欲しくない情報ですので,知ったことをここに記載しておきたいと思います.
配列名を "name",キーを "key",その値を "value" として.

  • 連想配列の生成は,;
    typeset -A name
    name=(key value key value ...)
    • `typeset -A name` と宣言が**必ず**必要.
      • 変数っぽく $name や ${name} な記述はしない.
      • 区切りは,すべて半角スペース.;
        • 各要素は,"key value" の順で,両者は半角スペース区切り.
        • 要素どうしは,これも半角スペース区切り.
    • 要素のセット方法は他に ;
      • name[key]=value *1
      • name+=(key value)
  • key を指定したアクセス方法は $name[key] ${name[key]}
    • value を返します.
  • value を変更する方法は,name[key]=value
    • 変数っぽく $name や ${name} な記述はしない.
  • value の一覧は $name
  • key の一覧は ${(k)name}
  • 要素数は ${#name}

こんなところかしら?

以下リファレンスさせていただいたサイト一覧.;

ありがとうございます.

できなかったこと

以下は仕様の話ではないと思います.
ただ自分が知らないだけのことだと思っています.
ちょっと内輪ネタ感満載ですが,今後の為に,作業履歴として落としておきたいと思います.*2

その1. 連想配列は,配列の要素としてつかう事はできない?

どうしてそんなことするん,とツッこまれるかもしれませんが,連想配列をさらに配列で管理することを思い立ちました.

こんなイメージです. 配列 array[index] の中に,連想配列 name(key1 value1 key2 value2 key3 value3) を格納する.と.

array[1] … name(key1 valueA1 key2 valueB1 key3 valueC1)
array[2] … name(key1 valueA2 key2 valueB2 key3 valueC2)
array[3] … name(key1 valueA3 key2 valueB3 key3 valueC3)
:

で問題は取り出す時なのですが,どうやるんでしょ.
配列の要素に入れると,連想配列の特徴である key,valueの意味合いがなくなってしまって,単なる純粋な要素になってしまう.

う~んどうやるのでしょう...
やめて,普通の配列にして cut で拾う方法をとることにしました.

key1is=`echo ${name} | cut -d , -f 1`

その2. 連想配列の value に半角スペースを使うことはできない?

value,半角スペースを含めてひとつの value としたい場合の上手い操り方が分らなかったです.

こんなイメージです.;

% typeset -A check
% check=(id 001 name "志村 けん" say "そーです あだすがへんなおずさんです")
% echo $check
001 志村 say あだすがへんなおずさんです

やめて,普通の配列 ordinary arrays を使う事にしました.

うーん.
時間とって manpage を解く必要がありますね...

う〜ん...
はてなブログでの markdown って何か中途半端な気がするなあ.
結局,html を打つことになり,
文章書くより,その形成で時間を要するというイタイ現実.

はてなブログMarkdown記法に対応しました - はてなブログ開発ブログ,は実はちょっと嘘で,"(何となく)" って注釈いれておいて欲しいw.

まぁ,"だったら使うんじゃねぇーよ" と,と言われるんでしょうがw

ということで,おしまい.
中途半端で,なのに大風呂敷.
気持ちは分かりますが,そいういうのうんこだと思いますです.

JAROに言うJARO(笑

以上.

*1:ちょっと注意."name[key]" が既にある場合は上書き,無い場合は新規で要素が追加されます.

*2:ほんっと "喉もと過ぎれば..." で,とりわけ苦体験はすぐ忘れる体になっているので.