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
我对 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