在 zsh 关联数组中找到与值匹配的键?

Find key that matches value in zsh associative array?

在常规数组中,我可以使用 (i)(I) 来搜索与给定值匹配的条目的索引(分别从数组的开头或结尾开始匹配):

list=(foo bar baz)
echo $list[(i)bar]
# => 2

这不适用于关联数组,获取找到值的键(之一):

declare -A hash=([foo]=bar [baz]=zoo)
echo $hash[(i)bar]
# => no output 

除了手动循环外,还有其他机制可以做到这一点吗?

这里有一些非常恶心的东西:

% declare -A hash=([foo]=bar [baz]=zoo)
% echo ${${(kA)hash}[${${(A)hash[@]}[(i)bar]}]}
foo

基本上,它由两部分组成:

  1. ${${(A)hash[@]}[(i)bar]},它计算 bar 在由关联数组的值组成的匿名数组中的索引。
  2. ${${(kA)hash}[...]},它使用前面展开计算得到的数值索引索引由关联数组的keys组成的匿名数组。

我不知道 I 标志的简短等效项,我也很惊讶关联数组的看似明显的扩展并不存在。

(r) 下标标志结合 (k) 参数标志应该给你 你想要什么:

declare -A hash=([foo]=bar [baz]=zoo)
echo ${(k)hash[(r)bar]}
# => foo

(r) 下标标志的手册页部分只谈到返回 值并忽略这种用法,所以很难找到。