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 Controllare la visita di un vettore e il suo ordinamento.
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 la sezione Tipi di variabile ed espressioni di confronto). 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 la sezione Vettori di vettori.)
Se si sceglie di utilizzare questa funzionalità per esaminare
tutti gli elementi di FUNCTAB
(vedi la sezione Variabili predefinite con cui awk
fornisce informazioni),
l’ordine in cui sono presentati gli elementi è: dapprima le
funzioni predefinite (vedi la sezione Funzioni predefinite), poi
le funzioni definite dall’utente (vedi la sezione Funzioni definite dall’utente)
e infine le funzioni caricate da un’estensione
(vedi la sezione Scrivere estensioni per gawk
).
"@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.
Quando i valori delle stringhe coincidono, vengono confrontati i valori
degli indici delle stringhe.
Quando si confrontano valori di tipo non-scalare si usa il criterio di
ordinamento "@val_type_asc"
e per questo 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 valori non-scalari sono confrontati usando il criterio di ordinamento
"@val_type_asc"
e per questo i sottovettori, se presenti,
vengono per ultimi.
Quando i valori numerici coincidono, vengono confrontati 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.
Quando i valori delle stringhe coincidono, vengono confrontati i valori
degli indici delle stringhe.
"@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.
Quando i valori delle stringhe coincidono, vengono confrontati i valori
degli indici delle stringhe.
Quando si confrontano valori di tipo non-scalare si usa il criterio di
ordinamento "@val_type_desc"
e per questo 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.
Quando i valori numerici coincidono, vengono confrontati i valori di
tipo stringa. Se anche questi sono identici, veogno confrontati i valori
della stringa di indice.
I valori non-scalari sono confrontati usando il criterio di ordinamento
"@val_type_desc"
e per questo 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 la sezione L’istruzione delete
.)
Inoltre, gawk
fornisce funzioni predefinite per l’ordinamento
dei vettori; si veda Ordinare valori e indici di un vettore con gawk
.
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]