# Test parameter subscripting. %prep s='Twinkle, twinkle, little *, [how] I [wonder] what? You are!' a=('1' ']' '?' '\2' '\]' '\?' '\\3' '\\]' '\\?' '\\\4' '\\\]' '\\\?') typeset -g -A A A=($a) %test x=',' print $s[(i)winkle] $s[(I)winkle] print ${s[(i)You are]} $#s print ${s[(r)$x,(R)$x]} 0:Scalar pattern subscripts without wildcards >2 11 >53 60 >, twinkle, little *, x='*' print $s[(i)*] $s[(i)\*] $s[(i)$x*] $s[(i)${(q)x}*] $s[(I)$x\*] print $s[(r)?,(R)\?] $s[(r)\?,(R)?] print $s[(r)\*,(R)*] print $s[(r)\],(R)\[] 0:Scalar pattern subscripts with wildcards >1 26 1 26 26 >Twinkle, twinkle, little *, [how] I [wonder] what? ? You are! >*, [how] I [wonder] what? You are! >] I [ print $s[(i)x] : $s[(I)x] print $s[(r)x] : $s[(R)x] 0:Scalar pattern subscripts that do not match >61 : 0 >: print -R $s[$s[(i)\[]] $s[(i)$s[(r)\*]] $s[(i)${(q)s[(r)\]]}] 0:Scalar subscripting using a pattern subscript to get the index >[ 1 33 print -R $a[(r)?] $a[(R)?] print $a[(n:2:i)?] $a[(n:2:I)?] print $a[(i)\?] $a[(I)\?] print $a[(i)*] $a[(i)\*] 0:Array pattern subscripts >1 ? >2 2 >3 3 >1 13 # It'd be nice to do some of the following with (r), but we run into # limitations of the ztst script parsing of backslashes in the output. print -R $a[(i)\\\\?] $a[(i)\\\\\?] print -R $a[(i)\\\\\\\\?] $a[(i)\\\\\\\\\?] print -R ${a[(i)\\\\\\\\?]} ${a[(i)\\\\\\\\\?]} print -R "$a[(i)\\\\\\\\?] $a[(i)\\\\\\\\\?]" print -R $a[(i)\]] $a[(i)\\\\\]] $a[(i)\\\\\\\\\]] $a[(i)\\\\\\\\\\\\\]] print -R $a[(i)${(q)a[5]}] $a[(i)${(q)a[8]}] $a[(i)${(q)a[11]}] print -R $a[(i)${a[3]}] $a[(i)${a[6]}] $a[(i)${a[9]}] $a[(i)${a[12]}] 0:Array pattern subscripts with multiple backslashes >4 6 >7 9 >7 9 >7 9 >2 5 8 11 >5 8 11 >1 3 4 6 print -R $A[1] $A[?] $A[\\\\3] $A[\\\]] print -R $A[$a[11]] print -R $A[${(q)a[5]}] 0:Associative array lookup (direct subscripting) >] \2 \\] \? >\\\? >\\\? # The (o) is necessary here for predictable output ordering print -R $A[(I)\?] ${(o)A[(I)?]} print -R $A[(i)\\\\\\\\3] print -R $A[(I)\\\\\\\\\?] ${(o)A[(I)\\\\\\\\?]} 0:Associative array lookup (pattern subscripting) >? 1 ? >\\3 >\\? \\3 \\? print -R $A[(R)\?] : ${(o)A[(R)?]} print -R $A[(R)\\\\\?] ${(o)A[(R)\\\\?]} ${(o)A[(R)\\\\\?]} print -R ${(o)A[(R)\\\\\\\\\]]} 0:Associative array lookup (reverse subscripting) >: ] >\? \2 \? \? >\\] eval 'A[*]=star' 1:Illegal associative array assignment ?(eval):1: A: attempt to set slice of associative array x='*' A[$x]=xstar A[${(q)x}]=qxstar print -R ${(k)A[(r)xstar]} $A[$x] print -R ${(k)A[(r)qxstar]} $A[${(q)x}] A[(e)*]=star A[\*]=backstar print -R ${(k)A[(r)star]} $A[(e)*] print -R ${(k)A[(r)backstar]} $A[\*] 0:Associative array assignment >* xstar >\* qxstar >* star >\* backstar o='[' c=']' A[\]]=cbrack A[\[]=obrack A[\\\[]=backobrack A[\\\]]=backcbrack print -R $A[$o] $A[$c] $A[\[] $A[\]] $A[\\\[] $A[\\\]] print -R $A[(i)\[] $A[(i)\]] $A[(i)\\\\\[] $A[(i)\\\\\]] 0:Associative array keys with open and close brackets >obrack cbrack obrack cbrack backobrack backcbrack >[ ] \[ \] print -R $A[$o] $A[$s[(r)\[]] print -R $A[(r)$c] $A[(r)$s[(r)\]]] print -R $A[$A[(i)\\\\\]]] 0:Associative array lookup using a pattern subscript to get the key >obrack obrack >] ] >backcbrack print -R ${A[${A[(r)\\\\\\\\\]]}]::=zounds} print -R ${A[${A[(r)\\\\\\\\\]]}]} print -R $A[\\\\\]] 0:Associative array substitution-assignment with reverse pattern subscript key >zounds >zounds >zounds print -R ${(o)A[(K)\]]} print -R ${(o)A[(K)\\\]]} 0:Associative array keys interpreted as patterns >\2 backcbrack cbrack star >\\\4 \\\? star zounds # It doesn't matter which element we get, since we never guarantee # ordering of an associative array. So just test the number of matches. array=(${(o)A[(k)\]]}) print ${#array} array=(${(o)A[(k)\\\]]}) print ${#array} 0:Associative array keys interpreted as patterns, single match >1 >1 typeset -g "A[one\"two\"three\"quotes]"=QQQ typeset -g 'A[one\"two\"three\"quotes]'=qqq print -R "$A[one\"two\"three\"quotes]" print -R $A[one\"two\"three\"quotes] A[one"two"three"four"quotes]=QqQq print -R $A[one"two"three"four"quotes] print -R $A[$A[(i)one\"two\"three\"quotes]] print -R "$A[$A[(i)one\"two\"three\"quotes]]" 0:Associative array keys with double quotes >QQQ >qqq >QqQq >qqq >QQQ print ${x::=$A[$A[(i)one\"two\"three\"quotes]]} print $x print ${x::="$A[$A[(i)one\"two\"three\"quotes]]"} print $x 0:More keys with double quotes, used in assignment-expansion >qqq >qqq >QQQ >QQQ qqq=lower QQQ=upper print ${(P)A[one\"two\"three\"quotes]} print "${(P)A[$A[(i)one\"two\"three\"quotes]]}" 0:Keys with double quotes and the (P) expansion flag >lower >upper typeset -ga empty echo X${${empty##*}[-1]}X 0:Negative index applied to substition result from empty array >XX print $empty[(i)] $empty[(I)] 0:(i) returns 1 for empty array, (I) returns 0. >1 0 array=(one two three four) print X$array[0]X 0:Element zero is empty if KSH_ZERO_SUBSCRIPT is off. >XX array[0]=fumble 1:Can't set element zero if KSH_ZERO_SUBSCRIPT is off. ?(eval):1: array: assignment to invalid subscript range print X$array[(R)notfound]X 0:(R) returns empty if not found if KSH_ZERO_SUBSCRIPT is off. >XX setopt KSH_ZERO_SUBSCRIPT print X$array[0]X 0:Element zero is element one if KSH_ZERO_SUBSCRIPT is on. >XoneX array[0]=fimble print $array 0:Can set element zero if KSH_ZERO_SUBSCRIPT is on. >fimble two three four print X$array[(R)notfound]X 0:(R) yuckily returns the first element on failure withe KSH_ZERO_SUBSCRIPT >XfimbleX unsetopt KSH_ZERO_SUBSCRIPT array[(R)notfound,(r)notfound]=(help help here come the seventies retreads) print $array 0:[(R)notfound,(r)notfound] replaces the whole array >help help here come the seventies retreads string="Why, if it isn't Officer Dibble" print "[${string[0]}][${string[1]}][${string[0,3]}]" 0:String subscripts with KSH_ZERO_SUBSCRIPT unset >[][W][Why] setopt KSH_ZERO_SUBSCRIPT print "[${string[0]}][${string[1]}][${string[0,3]}]" 0:String subscripts with KSH_ZERO_SUBSCRIPT set >[W][W][Why] unsetopt KSH_ZERO_SUBSCRIPT string[0,3]="Goodness" print $string 0:Assignment to chunk of string ignores element 0 >Goodness, if it isn't Officer Dibble string[0]=! 1:Can't set only element zero of string ?(eval):1: string: assignment to invalid subscript range