zparseopts com array associativo na versão antiga do zsh

3

Estou confuso com o comportamento diferente de zparseopts em duas versões diferentes do zsh. Basicamente eu estou tentando definir uma lista de valores de opção padrão em uma matriz associativa e substituir esses padrões com quaisquer opções especificadas na linha de comando. O código abaixo funciona bem para o zsh 5.0.6, mas se comporta de forma estranha para o 4.3.6 - especificamente, no zsh 4.3.6, toda a minha matriz de padrões é sobrescrita se uma única chave for sobrescrita.

myscript

typeset -A opts
opts=(
--opt1 a
--opt2 b
)

zparseopts -A opts -K -- -opt1: -opt2:
echo ${(k)opts}

Executando o script

$ myscript 
--opt1 --opt2  # both zsh 4.3.6 and 5.0.6

$ myscript --opt1 x
--opt1 --opt2  # zsh 5.0.6; element of array is replaced
--opt1         # zsh 4.3.6; adding an element overwrites the whole array, no more opt2

Esse comportamento é confuso porque 4.3.6 e 5.0.6 possuem entradas idênticas para a opção -K para zparseopts :

-K With this option, the arrays specified with the -a and -A options and with the '=array' forms are kept unchanged when none of the specs for them is used. This allows assignment of default values to them before calling zparseopts.

    
por Sean Mackesey 06.10.2014 / 23:35

1 resposta

4

Substitua a última linha do seu script por echo ${(kv)opts} . A execução com 4.3.6 e 5.0.6 deve mostrar que 4.3.6 interpreta -K para redefinir opts se qualquer opção for fornecida, enquanto 5.0.6 redefine apenas opts[--opt1] quando --opt1 é usado (deixando --opt2 ou qualquer outra entrada sozinha).

(Note que isto parece mudar entre 5.0.2 e 5.0.6; você pode pedir na lista de discussão zsh-workers para confirmar.) =

    
por 07.10.2014 / 20:59

Tags