Precedente: Visitare un intero vettore, Su: Fondamenti sui vettori [Contenuti][Indice]
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.
PROCINFO["sorted_in"]
un valore a scelta fra
alcuni valori predefiniti.
Si vedano più sotto i valori ammessi.
PROCINFO["sorted_in"]
al nome di una funzione definita
dall’utente, da usare per il confronto tra gli elementi di un vettore. Questa
funzionalità avanzata verrà descritta in seguito in Ordinamento di vettori.
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:
PROCINFO["sorted_in"]
è globale. Cioè, ha effetto su tutti
i cicli for
relativi a qualsiasi vettore. Se si deve cambiarlo
all’interno del proprio codice, si dovrebbe vedere se era già stato
definito in precedenza, e salvare il valore relativo, per ripristinarlo
successivamente:
… if ("sorted_in" in PROCINFO) { ordine_salvato = PROCINFO["sorted_in"] PROCINFO["sorted_in"] = "@val_str_desc" # o qualcos'altro } … if (ordine_salvato) PROCINFO["sorted_in"] = ordine_salvato
"@unsorted"
. Si può ottenere il comportamento di
default anche assegnando la stringa nulla a PROCINFO["sorted_in"]
o
semplicemente eliminando l’elemento "sorted_in"
dal vettore
PROCINFO
con l’istruzione delete
.
(L’istruzione delete
non è stata ancora descritta; vedi Cancellazione.)
Inoltre, gawk
fornisce funzioni predefinite per l’ordinamento
dei vettori; si veda Funzioni di ordinamento di vettori.
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: Visitare un intero vettore, Su: Fondamenti sui vettori [Contenuti][Indice]