Eu gostaria de usar o recurso KSH chamado variável composta para mostrar melhor o que está acontecendo no código.
Por outro lado, os valores interessantes são mantidos em uma matriz organizada por números. Eu gostaria de vincular a variável composta ao representante da matriz assim
typeset -n person.name=person_arr[0]
typeset -n person.surname=person_arr[1]
Mas como resultado eu consegui
ksh: typeset: person.name: is not an identifier
A questão é se variáveis compostas podem ser referenciadas com variáveis e, se não, como usar matrizes indexadas int de maneira mais elegante.
Responder1
A resposta mais simples é definir NAME=0 SURNAME=1
e usar essas variáveis em vez dos índices 0 e 1 em seu array, porém...
Você pode fazer o que quiser de uma maneira bastante demorada usandofunções de disciplina. Cada variável pode ter uma função set()
definida para ela; ele será chamado toda vez que a variável for alterada. Da mesma forma para get()
. Então você pode fazer o seguinte:
#!/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[@]}"
Isso declara uma variável composta person
e funções de disciplina para os subnomes .name
e .surname
. As set()
funções definem o valor indexado apropriado person_arr
para o novo valor (in .sh.value
) e as get()
funções "retornam" o valor indexado apropriado configurando .sh.value
.
O exemplo define a versão do array para um valor e, em seguida, os substitui pelos nomes compostos. A saída é
name is first second
name is first2 second2
name is first2 second2
Se você tem diversas variáveis que deseja vincular dessa forma, você deve procurar uma solução usandoseu próprio tipo ksh.
Responder2
Em ksh93
, nomes de variáveis compostos e namerefs
não combinam, mas funciona ao contrário:
typeset -n First=person.name
typeset -n Last=person.surname
person.name=John
person.surname=Doe
echo $First $Last
John Doe