在 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
基本上,它由两部分组成:
${${(A)hash[@]}[(i)bar]}
,它计算 bar
在由关联数组的值组成的匿名数组中的索引。
${${(kA)hash}[...]}
,它使用前面展开计算得到的数值索引索引由关联数组的keys组成的匿名数组。
我不知道 I
标志的简短等效项,我也很惊讶关联数组的看似明显的扩展并不存在。
(r)
下标标志结合 (k)
参数标志应该给你
你想要什么:
declare -A hash=([foo]=bar [baz]=zoo)
echo ${(k)hash[(r)bar]}
# => foo
(r)
下标标志的手册页部分只谈到返回
值并忽略这种用法,所以很难找到。
在常规数组中,我可以使用 (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}[...]}
,它使用前面展开计算得到的数值索引索引由关联数组的keys组成的匿名数组。
我不知道 I
标志的简短等效项,我也很惊讶关联数组的看似明显的扩展并不存在。
(r)
下标标志结合 (k)
参数标志应该给你
你想要什么:
declare -A hash=([foo]=bar [baz]=zoo)
echo ${(k)hash[(r)bar]}
# => foo
(r)
下标标志的手册页部分只谈到返回
值并忽略这种用法,所以很难找到。