Precedente: , Su: Fondamenti sui vettori   [Contenuti][Indice]


8.1.6 Visita di vettori in ordine predefinito con gawk

Questa sottosezione descrive una funzionalità disponibile solo in gawk.

Per default, quando un ciclo for visita un vettore, l’ordine è indeterminato, il che vuol dire che l’implementazione di awk determina l’ordine in cui il vettore viene attraversato. Quest’ordine normalmente è basato sull’implementazione interna dei vettori e varia da una versione di awk alla successiva.

Spesso, tuttavia, servirebbe fare qualcosa di semplice, come “visitare il vettore confrontando gli indici in ordine crescente,” o “visitare il vettore confrontando i valori in ordine decrescente.” gawk fornisce due meccanismi che permettono di farlo.

Sono disponibili i seguenti valori speciali per PROCINFO["sorted_in"]:

"@unsorted"

Lasciare gli elementi del vettore in ordine arbitrario (questo è il comportamento di default di awk).

"@ind_str_asc"

Ordinare in ordine crescente di indice, confrontando tra loro gli indici come stringhe; questo è l’ordinamento più normale. (Internamente, gli indici dei vettori sono sempre stringhe, per cui con ‘a[2*5] = 1’ l’indice è la stringa "10" e non il numero 10.)

"@ind_num_asc"

Ordinare in ordine crescente di indice, ma nell’elaborazione gli indici vengono trattati come numeri. Gli indici con valore non numerico verranno posizionati come se fossero uguali a zero.

"@val_type_asc"

Ordinare secondo il valore degli elementi in ordine crescente (invece che in base agli indici). L’ordinamento è in base al tipo assegnato all’elemento (vedi Tipi di variabile e confronti). Tutti i valori numerici precedono tutti i valori di tipo stringa, che a loro volta vengono prima dei sottovettori. (I sottovettori non sono ancora stati descritti; vedi Vettori di vettori.)

"@val_str_asc"

Ordinare secondo il valore degli elementi in ordine crescente (invece che in base agli indici). I valori scalari sono confrontati come stringhe. I sottovettori, se presenti, vengono per ultimi.

"@val_num_asc"

Ordinare secondo il valore degli elementi in ordine crescente (invece che in base agli indici). I valori scalari sono confrontati come numeri. I sottovettori, se presenti, vengono per ultimi. Quando i valori numerici coincidono, vengono usati i valori di tipo stringa per stabilire un ordinamento: ciò garantisce risultati coerenti tra differenti versioni della funzione C qsort(),42 che gawk usa internamente per effettuare l’ordinamento.

"@ind_str_desc"

Ordinare come fa "@ind_str_asc", ma gli indici di tipo stringa sono ordinati dal più alto al più basso.

"@ind_num_desc"

Ordinare come fa "@ind_num_asc", ma gli indici numerici sono ordinati dal più alto al più basso.

"@val_type_desc"

Ordinare come fa "@val_type_asc", ma i valori degli elementi, a seconda del tipo, sono ordinati dal più alto al più basso. I sottovettori, se presenti, vengono per primi.

"@val_str_desc"

Ordinare come fa "@val_str_asc", ma i valori degli elementi, trattati come stringhe, sono ordinati dal più alto al più basso. I sottovettori, se presenti, vengono per primi.

"@val_num_desc"

Ordinare come fa "@val_num_asc", ma i valori degli elementi, trattati come numeri, sono ordinati dal più alto al più basso. I sottovettori, se presenti, vengono per primi.

L’ordine in cui il vettore è visitato viene determinato prima di iniziare l’esecuzione del ciclo for. Cambiare PROCINFO["sorted_in"] all’interno del corpo del ciclo non influisce sul ciclo stesso. Per esempio:

$ gawk '
> BEGIN {
>    a[4] = 4
>    a[3] = 3
>    for (i in a)
>        print i, a[i]
> }'
-| 4 4
-| 3 3
$ gawk '
> BEGIN {
>    PROCINFO["sorted_in"] = "@ind_str_asc"
>    a[4] = 4
>    a[3] = 3
>    for (i in a)
>        print i, a[i]
> }'
-| 3 3
-| 4 4

Quando si ordina un vettore in base al valore dei suoi elementi, se viene trovato un valore che è un sottovettore, questo è considerato più grande di qualsiasi stringa o valore numerico, indipendentemente da quel che contiene lo stesso sottovettore, e tutti i sottovettori sono trattati come se fossero l’uno uguale all’altro. Il loro ordine reciproco è determinato dai loro indici, visti come stringhe.

Di seguito sono elencati alcuni punti da tener presenti sulla visita ordinata dei vettori:

Inoltre, gawk fornisce funzioni predefinite per l’ordinamento dei vettori; si veda Funzioni di ordinamento di vettori.


Note a piè di pagina

(42)

Quando due elementi risultano uguali, la funzione C qsort() non garantisce che dopo l’ordinamento venga rispettato il loro ordine relativo originale. Usando il valore di stringa per stabilire un ordinamento univoco quando i valori numerici sono uguali assicura che il comportamento di gawk sia coerente in differenti ambienti.


Precedente: , Su: Fondamenti sui vettori   [Contenuti][Indice]