ksh93を使用すると、空のインデックス付き配列ではなく、空の複合変数としてtypeset -a arr=( () )
作成されます。arr[0]
$ typeset -a arr=( () )
$ typeset -p arr[0]
typeset -C arr[0]=()
$
では、 vararr[0]
を宣言するときに、空のインデックス付き配列を初期化するにはどうすればよいですか?arr
ksh93を使用すると、空のインデックス付き配列ではなく、空の複合変数としてtypeset -a arr=( () )
作成されます。arr[0]
$ typeset -a arr=( () )
$ typeset -p arr[0]
typeset -C arr[0]=()
$
では、 vararr[0]
を宣言するときに、空のインデックス付き配列を初期化するにはどうすればよいですか?arr
$ ( typeset -a a[0]=(); typeset -p a 'a[0]' )
typeset -a a=( () )
typeset -a a[0]
確かなことは誰にもわからないと思います。あなたのスレッドで ksh の一見ランダムな宣言の背後にあるロジックのいくつかを誰かが説明できるかどうか尋ねましたが、返事はありませんでした。
この特定の問題の説明は、構文が強く示唆しているにもかかわらず、多次元のインデックス付き配列を「ネスト可能」と考えるのは間違いであると考えています。配列全体がすべて 1 つの型であるため、配列が宣言されると、「空のコレクション」を 0 番目の要素として個別に設定することはできません。a[0]
実際に入れ子にできる型は複合型のみであるため、少なくとも空の文字列を に代入せずに でベクターを作成しようとすると、複合型であると見なされますa[0][0]
。
別の言い方をすれば、 とすべてのサブ要素typeset -a a
のタイプをa
一度に設定するので、先に進んでより高い次元に値を追加し始めることができます。なぜなら、複合化せずに個別の属性を持つことはできないからです。
a
上記の構文は、とにかくのサブ要素に暗黙的に適用される属性を設定できる単なる抜け穴だと思います。あなたのように宣言しても、インデックス付き代入構文を使用して配列に値を追加すると、型が自動的にインデックス付きに戻されます (複合では宣言コマンドまたは代入が要素として想定されるため)。
$ ( typeset -a a=( () ); typeset -p a 'a[0]'; a[0]+=(x y z); typeset -p a 'a[0]' )
typeset -a a=(())
typeset -C a[0]=()
typeset -a a=(([1]=x [2]=y [3]=z) )
typeset -a a[0]=([1]=x [2]=y [3]=z)
もちろん、まだまだわからないことはたくさんあります。特に興味深いものを見つけたらLMK。:)これらの機能を使用しているのは私たちだけだと思います...サンプルコードを見つけるのはほぼ不可能です。
また、いくつかの ksh/bash/zsh スタイルの配列比較の文書化を開始しました ここ.
93v- 2013-02-13
kshの新しいバージョン(で試した)でハッキングする方法を見つけました:
$ echo ${.sh.version}
Version AJMP 93v- 2013-02-13
$ typeset -p arr
$ typeset -a arr=( ( ${not_existing_array[@]:0:0} ) )
$ typeset -p arr
typeset -a arr=( () )
$ typeset -p arr[0]
typeset -a arr[0]
$
インデックス付き配列の空のサブセットは依然としてインデックス付き配列であるため、これは合理的です。:)