zsh 数组实现(非关联数组)

zsh array implementation (not asociative array)

我对 zsh 完全陌生,是在发现 catalina 上的 macosx 高度推动它之后才开始使用它的。虽然一开始我有点迷失方向,但我设法增加了对它的了解,到目前为止我对它很满意。然而,我遇到了一个我无法用简单的 setopt 解决的问题,所以可能有人可以帮助我。

我遇到的问题是常规索引数组,如下面的片段

a[1]=1;         echo n=${#a[@]} ${a[@]}
a[1000000]=1;   echo n=${#a[@]} ${a[@]}
a[100000000]=1; echo n=${#a[@]} ${a[@]}

使用 bash(或 ksh)我得到了这个

$ a[1]=1;         echo n=${#a[@]} ${a[@]}
n=1 1

$ a[1000000]=1;   echo n=${#a[@]} ${a[@]}
n=2 1 1

$ a[100000000]=1; echo n=${#a[@]} ${a[@]}
n=3 1 1 1

用 zsh 我得到了这个

PW$ a[1]=1;         echo n=${#a[@]} ${a[@]}
n=2 1

PW$ a[1000000]=1;   echo n=${#a[@]} ${a[@]}
n=1000001 1 1

PW$ a[100000000]=1; echo n=${#a[@]} ${a[@]}
n=100000001 1 1 1

请注意,n= 中的 1 是由于我的 setopt ksharrays 造成的,但让我感到困扰的是,尽管我在数组中的条目很少,但 n= 的数量很大,这导致我精简 zsh索引数组是非稀疏的,但是为什么 ${a[@]} 不扩展它们,它以某种方式具有稀疏的概念。除了最后一行需要大量时间,一种拒绝服务 :) 可能所有工作站都挂了。

有人可能会争辩说,在解释性语言上使用如此大的索引来索引数组可能是错误的,但错误发生了,并且获得错误的索引(巨大)只会占用您的计算机而不是温和地告诉您离基地很远:)

所以我的问题是,我应该使用哪个选项 (setopt) 来获取索引稀疏数组?

感谢任何帮助。

我不与 zsh 合作,所以 fwiw ...

一些研究表明 zsh 数组索引从 1#(数组中的元素数)是连续的。

我找不到任何关于填充稀疏数组的引用(例如,索引 = 1、1000000 或 10000000)。

zsh 我运行:

$ a[1000000]=1

$ echo "${#a[@]}"
1000000

$ echo "${a[@]}"
1                                          # prints out a **LOT** of blank
....                                       # lines in my terminal with
               1                           # the last line showing the last '1' somewhere out in the middle of the terminal

$ typeset -p a                             # to reproduce the the entire array creation statement
typeset -a a=( 1 '' '' '' '' '' .... 1)    # this actually printed out 2x 1's and 999998x empty strings ('') !!!!

因此,看来 a[1000000]=1 实际上用 10000000 值填充数组。

您的 ${a[@]} 没有产生 'empty' 行的 LOT 这一事实可能与您的终端(设置)有关... ?

注意:尝试 运行 a[100000000]=1 由于试图创建一个包含 1 亿个条目的数组而耗尽了我(小型)VM 中的内存! :-)


我认为对于稀疏数组(在 zsh 中)您可能需要考虑使用关联数组,例如:

$ typeset -A c                    # designate 'c' as an associative array

$ c[1]=1
$ c[1000]=2

$ typeset -p c                    # display command to rebuild 'c' associative array from scratch
typeset -A c=( [1]=1 [100]=2 )

$ echo "${#c[@]}"
2
$ echo "${c[@]}"
1 2

并获取索引列表(又名 'keys')、值或索引(键)+值对列表:

$ echo "${(k)c[@]}"                   # list of 'k'eys
1 1000

$ echo "${(v)c[@]}"                   # list of 'v'alues
1 2

$ echo "${(kv)c[@]}"                  # list of 'k'ey + 'v'alue pairs
1 1 1000 2