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

在zsh关联数组中查找与值匹配的键?,zsh,associative-array,Zsh,Associative Array,在常规数组中,我可以使用(I)或(I)来搜索与给定值匹配的条目索引(分别从数组的开头或结尾开始第一次匹配): 对于关联数组,这不适用于获取(其中一个)找到值的键: declare -A hash=([foo]=bar [baz]=zoo) echo $hash[(i)bar] # => no output 除了手动循环之外,还有其他的机制可以做到这一点吗?这里有一些非常恶心的东西: % declare -A hash=([foo]=bar [baz]=zoo) % echo ${${(

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

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

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
它基本上由两部分组成:

  • ${${(A)hash[@]}[(i)bar]}
    ,它计算由关联数组的值组成的匿名数组中
    bar
    的索引
  • ${${(kA)hash}[…]}
    ,它使用上一次扩展计算的数字索引对由关联数组的键组成的匿名数组进行索引
  • 我不知道有一个与
    I
    标志相当的short,我也很惊讶,似乎显而易见的关联数组扩展并不存在。

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

    declare -A hash=([foo]=bar [baz]=zoo)
    echo ${(k)hash[(r)bar]}
    # => foo
    
    (r)
    下标标志上的手册页部分仅讨论返回
    值并忽略此用法,因此很难找到。

    我假设您不希望保留显式反向映射。我的意思是,这也很好,而且比必须进行循环要好。我习惯于bash,它甚至没有类似于
    [(I)]
    的东西。但是由于zsh确实有这样的功能,我有点惊讶它没有用于关联的情况。我有点希望我可以做
    ${(vk)}
    而不是
    $((kv)}
    ,并以相反的方式获得对,但是没有这样的运气。:)看起来zsh有足够的上下文知道如何将第一个子表达式作为数组处理,因此,您可以不使用第一个
    A
    标志:
    ${${(k)hash}[${${(A)hash}[(i)bar]}]}
    工作。不过还是有很多牙套。谢谢实际上,我完全错过了关于下标标志的文档,因为它们在zshparam中处于关闭状态,而不是在zshExpansion标志旁边。我只从示例中了解了
    (I)
    。但我现在已经找到了它们,我看到,事实上,
    (I)
    被描述为
    (r)
    的变体!就在我面前,如果我看的话。非常感谢。
    declare -A hash=([foo]=bar [baz]=zoo)
    echo ${(k)hash[(r)bar]}
    # => foo