zsh 参数扩展标志 (P) 与关联数组

zsh 参数扩展标志 (P) 与关联数组

在 zshexpn 手册页(zsh 版本 5.1.1)中,我们有:

参数扩展标志

(P):这强制参数名称的值被解释为进一步的参数名称,其值将在适当的情况下使用。请注意,使用排版命令系列之一(特别是转换)设置的标志不适用于以此方式使用的名称值。

因此,如果我有一个常规数组参数,我可以这样做:

typeset -a array
array=(x y)

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

这将输出x.我认为这是因为-a排版标志不需要将参数标记为数组。

但如果我对关联数组执行相同的操作:

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

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

屏幕上没有打印任何内容。这看起来与上面的手册页消息一致,因为如果我们运行:

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

我们得到的行为就好像标志-Atotypeset被丢弃一样,并且我们有一个普通的数组。

但如果我运行以下命令:

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

那么似乎在某种意义上关联数组状态并不总是丢失。所以我真的不明白为什么它被设计成typeset丢弃标志,而看起来他们并不总是这样做。

主要是,我的问题是:有没有办法做到这一点:

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

返回x(与 key 关联的值foo),就好像该typeset -A标志没有被丢弃一样,我可以像任何其他关联数组一样对待它。我想不是求助于使用evals:是否有一些我可以使用的 zsh 参数技巧?

相关内容