Successivo: Funzioni di tipo generale, Su: Funzioni di libreria [Contenuti][Indice]
Per come si è sviluppato il linguaggio awk
, le variabili sono
o globali (usabili dall’intero programma) o locali (usabili solo
in una specifica funzione). Non c’è uno stato intermedio analogo alle
variabili statiche
in C.
Le funzioni di libreria hanno spesso necessità di avere variabili globali da
usare per conservare informazioni di stato tra successive chiamate alla
funzione; per esempio, la variabile di getopt()
_opti
(vedi la sezione Elaborare opzioni specificate sulla riga di comando).
Tali variabili vengono dette private, poiché le sole funzioni che
devono usarle sono quelle della libreria.
Quando si scrive una funzione di libreria, si dovrebbe cercare di scegliere per
le variabili private dei nomi che non entrano in conflitto con nessuna delle
variabili usate da un’altra funzione di libreria o dal programma principale di
un utente. Per esempio, un nome come i
o j
non è una buona
scelta, perché i programmi a livello utente usano spesso nomi di variabile come
questi per le proprie elaborazioni.
I programmi di esempio mostrati in questo capitolo usano per le loro variabili private nomi che iniziano con un trattino basso(‘_’). Generalmente gli utenti non usano trattini bassi iniziali nei nomi di variabile, così questa convenzione riduce le possibilità che il nome di variabile coincida con un nome usato nel programma dell’utente.
Inoltre, parecchie funzioni di libreria usano un prefisso che suggerisce
quale funzione o gruppo di funzioni usa quelle variabili; per esempio,
_pw_byname()
nelle routine che consultano la lista degli utenti
(vedi la sezione Leggere la lista degli utenti).
L’uso di questa convenzione viene raccomandata, poiché riduce ulteriormente la
possibilità di conflitti accidentali tra nomi di variabile. Si noti che questa
convenzione può anche essere usata per i nomi di variabile e per i nomi delle
funzioni private.68
Come nota finale sui nomi delle variabili, se una funzione rende
disponibile una variabile globale per essere usata da un programma principale,
è una buona convenzione quella di far iniziare i nomi di queste variabili con
una lettera maiuscola; per esempio, Opterr
e Optind
di
getopt()
(vedi la sezione Elaborare opzioni specificate sulla riga di comando).
La lettera maiuscola iniziale indica che la variabile è globale,
mentre il fatto che
il nome della variabile non è tutto in lettere maiuscole indica che la variabile
non è una delle variabili predefinite di awk
, come FS
.
È importante anche che tutte le variabili nelle funzioni di libreria che non abbiano la necessità di essere conservate per tutta la durata del programma siano, di fatto, dichiarate come locali.69 Se ciò non viene fatto, la variabile potrebbe essere usata accidentalmente nel programma dell’utente, conducendo a errori che sono molto difficili da scoprire:
function lib_func(x, y, l1, l2) { … # qualche_var dovrebbe essere locale ma per una svista non lo è uso della variabile qualche_var … }
Una differente convenzione, comune nella comunità Tcl, è quella di usare un
solo vettore associativo che contiene i valori necessari alle funzioni di
libreria, o “package.” Questo riduce significativamente il numero degli
effettivi nomi globali in uso. Per esempio, le funzioni descritte in
Leggere la lista degli utenti
potrebbero aver usato gli elementi di vettore
PW_data["inizializzato"]
,
PW_data["totale"]
, PW_data["contatore"]
, e
PW_data["awklib"]
, al posto di _pw_inizializzato
,
_pw_totale
,
_pw_awklib
e
_pw_contatore
.
Le convenzioni illustrate in questa sezione sono esattamente quello che indica il termine: convenzioni. Non si è obbligati a scrivere i propri programmi in questo modo: è solo auspicabile che lo si faccia.
A partire dalla versione 5.0, gawk
fornisce
un meccanismo efficiente per risolvere i problemi descritti in
questa sezione: gli spazi-dei-nomi (spazi-dei-nomi).
Gli spazi-dei-nomi e il loro utilizzo sono descritti in dettaglio
in Spazi-dei-nomi in gawk
.
Sebbene tutte le routine di libreria si sarebbero
potute riscrivere usando questa convenzione, ciò non è stato fatto, per far
vedere come lo stile di programmazione in awk
si è evoluto e
per fornire alcuni spunti per questa spiegazione.
L’opzione da riga di comando di gawk
--dump-variables è utile per verificare questo.
Successivo: Funzioni di tipo generale, Su: Funzioni di libreria [Contenuti][Indice]