如何解决在zsh关联数组中查找与值匹配的键?
在常规数组中,我可以使用(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
基本上,它由两部分组成:
-
${${(A)hash[@]}[(i)bar]}
,它在由关联数组的值组成的匿名数组中计算bar
的索引。 -
${${(kA)hash}[...]}
,它使用上一次扩展计算出的数字索引来索引由关联数组的 key 组成的匿名数组。
我不知道它与I
标志有什么短距离对应关系,我也很惊讶,似乎不存在对关联数组的明显扩展。
将(r)
下标标志与(k)
参数标志结合使用可以为您提供
您想要什么:
declare -A hash=([foo]=bar [baz]=zoo)
echo ${(k)hash[(r)bar]}
# => foo
(r)
下标标志上的手册页部分仅讨论返回
值并忽略此用法,因此很难找到。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。