Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: indirect array element assignment?
On Sat, Jul 2, 2022 at 3:34 AM Anthony Heading <ajrh@xxxxxxxx> wrote:
>
> What's the best zsh way of doing an indirect array element assignment?
fruits=("apple" "banana" "carrot")
v=fruits
typeset "${v}[3]"=cherry
There really isn't a good solution if you're trying to do array
slices, i.e., a parenthesized list on the right of the "=".
> Everything in zsh I've tried around ${${(P)v}[2]::=cherry} with misc different bracketing gets "not an identifier", suggesting maybe the ::= form doesn't support subscripting.
It's not that it doesn't support subscripting, it's that it doesn't
support parameter expansions of any kind on the left:
% echo ${${grape}::=raisin}
zsh: not an identifier:
I'm not sure why the error isn't more specific.
The syntax, if it worked, would be ${(P)v[3]::=cherry}, because
${(AP)=v::=apple banana carrot} works, but although ${(P)v} gets you a
reference to $fruits, as soon as you subscript it as ${(P)v[x]} you
end up assigning to a copy of the x'th field of $fruits instead,
because zsh doesn't create indirect references to array elements, it
substitutes them by value.
You can do it this way:
z="${v}[3]"
echo ${(P)z::=cherry}
Messages sorted by:
Reverse Date,
Date,
Thread,
Author