隨着ksh93的,typeset -a arr=(())
將創建arr[0]
作爲空化合物變種而不是一個空索引數組:隨着ksh93的,如何安全地初始化2-尺寸索引數組(())
$ typeset -a arr=(())
$ typeset -p arr[0]
typeset -C arr[0]=()
$
因此,如何能我在初始化arr[0]
時聲明arr
var爲空索引數組?
隨着ksh93的,typeset -a arr=(())
將創建arr[0]
作爲空化合物變種而不是一個空索引數組:隨着ksh93的,如何安全地初始化2-尺寸索引數組(())
$ typeset -a arr=(())
$ typeset -p arr[0]
typeset -C arr[0]=()
$
因此,如何能我在初始化arr[0]
時聲明arr
var爲空索引數組?
我發現了新版本的ksh的黑客方式(與93v- 2013-02-13
試過):這是一種合理的索引數組的一個空子集仍然是一個索引數組
$ 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]
$
。 :)
$ (typeset -a a[0]=(); typeset -p a 'a[0]')
typeset -a a=(())
typeset -a a[0]
我不認爲有人知道肯定。我詢問是否有人能解釋一下ksh在your thread中看似隨機的聲明背後的一些邏輯,但從來沒有得到答覆。
我相信對這個特定問題的解釋是,將多維索引數組考慮爲「可嵌套」是錯誤的,即使語法強烈暗示它也是如此。整個數組都是一種類型,所以一旦聲明瞭數組,就不能單獨將「空集合」設置爲第零個元素。唯一真正的可嵌套類型是化合物,所以通過嘗試創建一個在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風格的數組比較。
爲什麼你認爲你需要在添加值之前聲明它? – ormaaj 2013-03-19 04:42:54
@ormaaj:沒有具體原因。作爲編程語言的Ksh應該支持這一點。 :) – pynexj 2013-03-19 04:48:10