diff options
-rw-r--r-- | Doc/Zsh/params.yo | 7 | ||||
-rw-r--r-- | Src/params.c | 6 | ||||
-rw-r--r-- | Test/D06subscript.ztst | 10 |
3 files changed, 19 insertions, 4 deletions
diff --git a/Doc/Zsh/params.yo b/Doc/Zsh/params.yo index dedde051f..bf12b5ded 100644 --- a/Doc/Zsh/params.yo +++ b/Doc/Zsh/params.yo @@ -263,9 +263,10 @@ testing for values or keys that do not exist. item(tt(k))( If used in a subscript on an associative array, this flag causes the keys to be interpreted as patterns, and returns the value for the first key -found where var(exp) is matched by the key. This flag does not work on -the left side of an assignment to an associative array element. If used -on another type of parameter, this behaves like `tt(r)'. +found where var(exp) is matched by the key. Note this could be any +such key as no ordering of associative arrays is defined. +This flag does not work on the left side of an assignment to an associative +array element. If used on another type of parameter, this behaves like `tt(r)'. ) item(tt(K))( On an associative array this is like `tt(k)' but returns all values where diff --git a/Src/params.c b/Src/params.c index bbacb5476..0bd909905 100644 --- a/Src/params.c +++ b/Src/params.c @@ -1127,7 +1127,11 @@ getarg(char **str, int *inv, Value v, int a2, zlong *w, v->isarr &= ~SCANPM_WANTVALS; } else if (rev) v->isarr |= SCANPM_WANTVALS; - if (!down && !keymatch && ishash) + /* + * This catches the case where we are using "k" (rather + * than "K") on a hash. + */ + if (!down && keymatch && ishash) v->isarr &= ~SCANPM_MATCHMANY; } *inv = ind; diff --git a/Test/D06subscript.ztst b/Test/D06subscript.ztst index 4cb814977..cffca742e 100644 --- a/Test/D06subscript.ztst +++ b/Test/D06subscript.ztst @@ -145,6 +145,16 @@ >\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]" |