Re: feature proposal: expand associative arrays in lexicographic order of keys

Chet Ramey <[email protected]>
Newsgroups gmane.comp.shells.bash.bugs
Organization ITS, Case Western Reserve University
Message-ID <[email protected]>
On 8/23/26 8:04 PM, Zachary Santer wrote:
> given the current locale's collation order.
> 
> I'm actually struggling to find where the devel branch's doc/bash.1
> bothers to say that the expansion of indexed arrays subscripted by @
> or * is in numerical order of indices and the expansion of associative
> arrays subscripted by @ or * is in arbitrary order.

It doesn't specify expansion order at all.

It makes the most sense to expand indexed arrays in ascending order of
indices, to sort of mirror C arrays. It doesn't make sense to impose
some kind of ordering on associative arrays, which are essentially
dicts/hash tables.

> When expansion order matters at all, this is liable to be what the
> shell programmer would prefer. ${!assoc[@]} expanding in lexicographic
> order would make for a slight improvement in one of my scripts, at
> least.

This is not a feature that has been in great demand (or any demand,
really), especially not sorting in lexicographic order for keys.

If you want to wait for the next devel branch push, I added a -I option
to the `asort' loadable builtin to sort an associative array by keys
and assign those keys in order to an indexed array. (The existing -i
option is like awk's asorti, which sorts by values and then assigns the
keys, so it was only a small change.) See if that does what you want
without any other changes.

> I can't imagine a scenario where a script would depend upon an
> associative array expanding in not necessarily a sorted order, but
> this functionality could be controlled by a shopt option. 

I think if such a feature were to be implemented, it would be better
to implement it as a parameter transformation. When you need it, you
get it.

> Maybe it
> would save a few clock cycles if the programmer doesn't care. On the
> other hand, how would bash handle this shopt option being enabled
> after associative arrays have already been assigned to?

I don't think a shopt option is the way to go, but why would it matter?
You only want an expansion, right? So you get a sorted expansion, where
the ordering is whatever the current locale says it is at expansion time.

> So that linked list would have to be maintained throughout the
> lifetime of the indexed array. The same would go for associative
> arrays with keys sorted.

You don't have to change the underlying data structure, nor do you have
to keep keys (or values) sorted.

> Some locales weight different strings equally, so that would add
> another little wrinkle. Elements with indices with equal lexicographic
> weight could be placed in arbitrary order, relative to each other. The
> shell programmer could always set LC_COLLATE to C.UTF-8 if it matters
> that much to them.

C.UTF-8 isn't valid everywhere, so you're already making assumptions. But
this also doesn't matter, or at least is easy to deal with, since a qsort
string comparison function using strcoll(3) hides all that and lets the
locale determine the order.

-- 
``The lyf so short, the craft so long to lerne.'' - Chaucer
		 ``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, UTech, CWRU    [email protected]    http://tiswww.cwru.edu/~chet/
OpenPGP_signature.asc (application/pgp-signature, 203 B)
-----BEGIN PGP SIGNATURE-----

wmMEABEIACMWIQR8ATX7CIqvbGbGULm7WGnwZOp0qwUCaoyw4QUDAAAAAAAKCRC7WGnwZOp0q9JY
AJ90HE+FJZHVXoh+AToRYaRpmIgyHQCgi1GRN+kgLRmyS9qlKOV/Niz6g/M=
=dqr3
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.