zsh sinalizador de expansão de parâmetro (P) com matrizes associativas

1

Na página de manual do zshexpn (zsh versão 5.1.1) temos:

Parameter Expansion Flags

(P): This forces the value of the parameter name to be interpreted as a further parameter name, whose value will be used where appropriate. Note that flags set with one of the typeset family of commands (in particular case transformations) are not applied to the value of name used in this fashion.

Então, se eu tiver um parâmetro de matriz regular, posso fazer isso:

typeset -a array
array=(x y)

ptr=array
echo ${${(P)ptr}[1]}

e isso produzirá x . Presumo que seja porque o sinalizador -a typeset não é necessário para marcar o parâmetro como uma matriz.

Mas se eu fizer o mesmo com um array associativo:

typeset -A assoc
assoc=(foo x bar y)

ptr=assoc
echo ${${(P)ptr}[foo]}

nada é impresso na tela. Isso parece consistente com a mensagem da página man acima, porque se nós executarmos:

echo ${(P)ptr}
# returns: x y
echo ${${(P)ptr}[1]}
# returns: x
echo ${${(P)ptr}[2]}
# returns: y

obtemos um comportamento como se o -A flag para typeset fosse descartado e tivéssemos um array normal.

Mas se eu executar o seguinte:

echo ${(Pk)ptr}
# returns: foo bar
echo ${(Pv)ptr}
# returns: x y
echo ${(Pkv)ptr}
# returns: foo x bar y

então parece que, em certo sentido, o status da matriz associativa nem sempre é perdido. Então, eu realmente não entendo por que ele foi projetado para que typeset flags sejam descartados, quando parece que eles nem sempre fazem isso de qualquer maneira.

E, principalmente, minha pergunta é: existe alguma maneira de fazer isso:

echo ${${(P)ptr}[foo]}

retorna x (o valor associado à chave foo ) como se o typeset -A flag não fosse descartado, e eu posso tratá-lo como qualquer outro array associativo. Eu gostaria que não recorresse ao uso de eval s: existe algum truque de parâmetro zsh que eu possa usar?

    
por Zorawar 07.04.2017 / 05:11

0 respostas