繁体   English   中英

MacOS 上的 zsh:如何从两个类似列的标量创建关联数组(哈希表)?

[英]zsh on MacOS: how to create an associative array (hash table) from the from two column-like scalars?

我有两个列形式的标量值:

% echo $key
hom
doc
fam

echo $val
'home'
'Documents'
'Family'

我想从它们创建关联数组。

我知道创建关联数组的方法如下:

declare -A my_assoc_arr
my_assoc_arr=(hom home doc Documents fam Family)

但是,通过消化$key$val的形式(标量,类列)来创建关联数组的最简单方法是什么? 是否还有其他关联语法,或者我需要努力将$key$val改组为上面的关联语法?

您可能需要一个循环,但不会太乱。 您只需使用两个read命令一次从每个字符串中读取一行。

typeset -A arr

while IFS= read -u 3 -r k
      IFS= read -u 4 -r v
do
    arr[$k]=$v
done 3<<< $key 4<<< $val

第一次read从文件描述符 3 读取(从$key创建的此处字符串重定向,第二次从文件描述符 4 读取(同样从$val重定向)。

$ typeset -p arr
typeset -A arr=( [doc]=Documents [fam]=Family [hom]=home )

(这假设keyval具有相同的行数。我不想 go 在处理替代方案时陷入困境,这让您决定如何处理剩余的键或值。)

zsh中,您还可以使用 'zip' 运算符将两个标准 arrays 重新排列为您提到的关联数组语法:

typeset -a keys=("${(f@)key}") vals=("${(f@)val}")
typeset -A arr=("${(@)keys:^vals}")

部分作品:

  • ${f)...} - 使用f参数扩展标志在换行处拆分字符串。
  • "${(@)...}" - 确保处理空值和带空格的值(这里可能不是绝对必要的)。
  • ${...:^...} - 将两个 arrays 压缩在一起,交替使用每个数组的值。 结果数组将是最短输入数组长度的两倍。
  • typeset -A arr=(k1 v1 k2 v2) - 从交替的键和值创建一个关联数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM