summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Doc/Zsh/params.yo7
-rw-r--r--Src/params.c6
-rw-r--r--Test/D06subscript.ztst10
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]"