On 4/13/21 5:18 AM, Koichi Murase wrote:
I actually doubt whether there are real use cases for the behavior that «iref=a[@]; ${!iref}» or «declare -n nref=a[@]; $nref» expands to all the elements of *associative* arrays. Maybe it is useful to expand the indexed arrays in this way because indexed arrays contain a sequence of values. But associative arrays usually contain a set of unordered key-value pairs, so I guess there are not so many chances to expand only the values without specifying keys.
I'd dispute that. There are multiple use cases for the set of values in an associative array.
It's just a naive idea and may be imperfect, but how about changing the behavior of assoc[@] (except for "${assoc[@]}") only for associative arrays while keeping the current behavior for indexed arrays?
Some of this is reasonable. In the following list, the items marked with (*) are the
behavior different from the current one. I listed examples for key=@, but the same for key=*. unset 'indexed' # remove the indexed array unset 'assoc' # remove the associative array unset 'indexed[@]' # empty the array (*) unset 'assoc[@]' # remove the element of key=@ (*)
We've already discussed these. I'm ok with the change to associative arrays, since there's already a way to do it and it seems more straightforward to remove the element with key `@'. I'd have to think about the changed to indexed arrays, since you can already do it with `indexed=()'. It's a novel new use case.
iref=indexed[@]; ${!iref} # all the elements iref=assoc[@]; ${!iref} # the element of key=@ (*)
No, there's no reason to have ${!iref} and ${assoc[@]} behave differently.
declare -n nref=indexed[@] # reference all the elements declare -n nref=assoc[@] # reference the element of key=@ (*)
Same reason.
test -v 'indexed[@]' [ -v 'indexed[@]' ] [[ -v indexed[@] ]] # test if the indexed array is non-empty test -v 'assoc[@]' [ -v 'assoc[@]' ] [[ -v assoc[@] ]] # test if the associative array has the key '@' (*)
I'm ok with this.
printf -v 'indexed[@]' xxx # error printf -v 'assoc[@]' xxx # assign to the element of key=@ (*)
I think this is ok, too, for the same reason as:
We don't change the following behavior of associative arrays where the syntactic information may distinguish a[$key] from a[@]: indexed[@]=xxx, assoc[@]=xxx # error
I think it's ok to allow assoc[@]=value since indexed[@]=xxx is going to be an error no matter which behavior you choose because it's an invalid arithmetic expression. -- ``The lyf so short, the craft so long to lerne.'' - Chaucer ``Ars longa, vita brevis'' - Hippocrates Chet Ramey, UTech, CWRU c...@case.edu http://tiswww.cwru.edu/~chet/