2013-03-13 49 views

回答

0

我發現了新版本的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] 
$ 

。 :)

+0

爲什麼你認爲你需要在添加值之前聲明它? – ormaaj 2013-03-19 04:42:54

+0

@ormaaj:沒有具體原因。作爲編程語言的Ksh應該支持這一點。 :) – pynexj 2013-03-19 04:48:10

1
$ (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 aa和類型在一旦所有的子元素,所以你可以繼續前進,開始增加值更高的維度,因爲他們不可能有沒有被分開的複合屬性。

我認爲上面的語法只是一個漏洞,允許設置隱含地適用於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風格的數組比較​​。

相關問題