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 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:

Inoltre, gawk fornisce funzioni predefinite per l’ordinamento dei vettori; si veda Ordinare valori e indici di un vettore con gawk.


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]