コード内で何が起こっているかをわかりやすく示すために、複合変数と呼ばれる 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
インデックス値を新しい値 ( 内.sh.value
) に設定し、get()
関数は を設定することで適切なインデックス値を「返します」.sh.value
。
この例では、配列バージョンを1つの値に設定し、それを複合名で上書きします。出力は次のようになります。
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