Referencia de variables compuestas de Ksh

Referencia de variables compuestas de Ksh

Me gustaría utilizar la función KSH llamada variable compuesta para mostrar mejor lo que sucede en el código.

Por otro lado, los valores interesantes se mantienen en una matriz organizada por números. Me gustaría vincular una variable compuesta a un representante de matriz como este

typeset -n person.name=person_arr[0]
typeset -n person.surname=person_arr[1]

Pero como resultado obtuve

ksh: typeset: person.name: is not an identifier

La pregunta es si las variables compuestas pueden ir con referencias de variables y, en caso contrario, cómo usar matrices indexadas int de una manera más elegante.

Respuesta1

La respuesta más simple es configurar NAME=0 SURNAME=1y usar estas variables en lugar de los índices 0 y 1 en su matriz, sin embargo...

Puedes hacer lo que quieras de una manera bastante prolija usandofunciones de disciplina. Cada variable puede tener una función set()definida para ella; Se llamará cada vez que se cambie la variable. De manera similar para get(). Entonces puedes hacer lo siguiente:

#!/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[@]}"

Esto declara una variable compuesta persony funciones de disciplina para los subnombres .namey .surname. Las set()funciones establecen el valor indexado apropiado person_arral nuevo valor (en .sh.value) y las get()funciones "devuelven" el valor indexado apropiado configurando .sh.value.

El ejemplo establece la versión de la matriz en un valor y luego los sobrescribe con los nombres compuestos. La salida es

name is first second
name is first2 second2
name is first2 second2

Si tiene varias variables que desea vincular de esta manera, debe buscar una solución usandotu propio tipo ksh.

Respuesta2

En ksh93, los nombres de variables compuestas namerefsno van juntos, pero funciona al revés:

typeset -n First=person.name       
typeset -n Last=person.surname
person.name=John
person.surname=Doe
echo $First $Last
John Doe

información relacionada