コードで何が起こっているのかをよりよく示すために、複合変数と呼ばれるKSH機能を使用したいと思います。
一方、私の興味深い値は数値的に整理された配列として保存されます。次のように、複合変数を配列デリゲートにバインドしたいと思います。
typeset -n person.name=person_arr[0]
typeset -n person.surname=person_arr[1]
しかし、結果的に私は得た。
ksh: typeset: person.name: is not an identifier
問題は、複合変数を変数参照と共に使用できるかどうか、そうでない場合はintインデックス配列をよりエレガントな方法で使用する方法です。
答え1
最も簡単な答えは、NAME=0 SURNAME=1
配列の0と1のインデックスの代わりにこれらの変数を設定して使用することですが...
やや冗長な方法で好きなことをすることができます懲戒機能。各変数には定義された関数があり、set()
変数が変更されるたびに呼び出されます。でも同様ですget()
。したがって、次のことができます。
#!/bin/ksh
typeset -C person
function person.name.set {
person_arr[0]=${.sh.value}
}
function person.name.get {
.sh.value=${person_arr[0]}
}
function person.surname.set {
person_arr[1]=${.sh.value}
}
function person.surname.get {
.sh.value=${person_arr[1]}
}
typeset -a person_arr
person_arr[0]=first person_arr[1]=second
echo "name is ${person.name} ${person.surname}"
person.name=first2 person.surname=second2
echo "name is ${person.name} ${person.surname}"
echo "name is ${person_arr[@]}"
person
これは、サブ名と合計の複合変数と.name
規則関数を宣言します.surname
。これらset()
の関数は適切なperson_arr
インデックス値を新しい値(in .sh.value
)に設定し、get()
関数はそれを設定して適切なインデックス値を「返します」.sh.value
。
この例では、配列バージョンを値に設定し、それを複合名で上書きします。出力は次のとおりです
name is first second
name is first2 second2
name is first2 second2
この方法で複数の変数をバインドするには、次のように解決策を見つける必要があります。独自のkshタイプ。
答え2
では、ksh93
複合変数名はnamerefs
一緒に使用されませんが、反対方向に動作します。
typeset -n First=person.name
typeset -n Last=person.surname
person.name=John
person.surname=Doe
echo $First $Last
John Doe