Nella maggior parte dei linguaggi di programmazione, come nel caso del linguaggio C o Java, il tipo di dato array è una struttura dati che associa un indice rappresentato da un numero intero al dato che si vuole memorizzare.
Il nostro amato linguaggio Tcl, invece, utilizza come tipo di dato per l’indicizzazione la stringa. Inoltre l’indice viene denominato con il termine nome. L’associazione avviene quindi tra un nome e il suo valore che vanno quindi a formare una coppia, anche detta elemento dell’array associativo.
Anche altri linguaggi di scripting come Python, Perl o PHP, utilizzano la stringa, ma nella loro documentazione, invece di utilizzare il termine array si utilizza il termine hash table.
Fatta questa breve premessa torniamo ad occuparci del nostro Tcl e della sintassi che dobbiamo utilizzare per i nostri arrays.
Per prima cosa in Tcl il nome di un elemento deve essere racchiuso tra parentesi tonde.
set name(first) "Mary"
set name(last) "Poppins"
puts "Full name: $name(first) $name(last)"
---
Full name: Mary Poppins
Lista sottocomandi per lavorare con un array
Di seguito vedremo tutta una serie di sottocomandi del comando array che ci permettono di lavorare con la struttura dati di un array associativo.
Verifica array
# sintassi
array exists arrayName
Il sottocomando exists restituisce il valore 1 se arrayName è una variabile array, altrimenti restituisce il valore 0 se arrayName fa riferimento ad una variabile scalare, ad una procedura, oppure se semplicemente non esiste.
# esempio
set name(first) "Mary"
set name(last) "Poppins"
puts "result of exists: [array exists name]"
---
result of exists: 1
Dimensione di un array
# sintassi
array size arrayName
Il sottocomando size ritorna il numero degli elementi dell’array arrayName.
# esempio
set name(first) "Mary"
set name(last) "Poppins"
puts "result of size: [array size name]"
---
result of size: 2
Lista dei nomi degli elementi
# sintassi
array names arrayName ?pattern?
Il sottocomando names restituisce la lista dei nomi di tutti gli elementi contenuti nell’array arrayName.
Se viene indicata la stringa pattern, vengono restituiti soltanto quei nomi che rispettano i criteri specificati in pattern. Il confronto avviene secondo quanto già visto nell’articolo Ricerca con caratteri speciali.
# esempio
set name(first) "Mary"
set name(last) "Poppins"
puts "result of names: [array names name]"
puts "result of names with pattern: [array names name "f*"]"
---
result of names: last first
result of names with pattern: first
Ottenere tutti gli elementi di un array
# sintassi
array get arrayName
Il sottocomando get restituisce una lista composta da tutti gli elementi dell’array associativo. Ciascun elemento sarà una coppia formata dal nome dell’elemento e dal suo valore.
# esempio
set name(first) "Mary"
set name(last) "Poppins"
puts "result of get: [array get name]"
---
result of get: last Poppins first Mary
Convertire una lista in un array associativo
# sintassi
array set arrayName dataList
Converte una lista (che deve essere nel formato coppie di elementi nome/valore) in un array associativo.
# esempio
set myList [list "first" "Mary" "last" "Poppins"]
array set myArray $myList
puts "This is the list: $myList"
puts "This is the array: [array get myArray]"
---
This is the list: first Mary last Poppins
This is the array: last Poppins first Mary
Rimuovere gli elementi da un array
# sintassi
array unset arrayName ?pattern?
Il sottocomando unset rimuove dall’array arrayName tutti quegli elementi i cui nomi corrispondono ai criteri riportati in pattern. Se non viene specificato alcun pattern, allora vengono rimossi dall’array tutti gli elementi.
# esempio
set name(first) "Mary"
set name(last) "Poppins"
puts "result of get: [array get name]"
array unset name "f*"
puts "result of get after unset subcommand: [array get name]"
---
result of get: last Poppins first Mary
result of get after unset subcommand: last Poppins
Come utilizzare al meglio un array associativo
Un array associativo può essere utilizzato per diversi scopi.
Come semplice database
Come abbiamo visto, in Tcl un array associativo non è altro che un insieme di coppie nome/valore. Questa struttura richiama quella di una semplice tabella con due sole colonne. Possiamo quindi sfruttare un array associativo come fosse un piccolo database.
Come raccoglitore di variabili globali
Quando si vuole utilizzare una variabile definita all’interno di una specifica procedura anche in altre procedure, la si deve definire utilizzando il comando global come abbiamo accennato nell’articolo Area di visibilità delle variabili.
Se la nostra applicazione ha molte procedure che lavorano sulle stesse variabili, invece di renderle tutte globali, con il rischio di creare dei conflitti dovuti agli eventuali stessi nomi di variabili, è possibile raccogliere tutte quelle variabili che coerentemente rappresentano un certo stato della nostra applicazione in un unico array associativo e rendere globale soltanto il nome di questo array. In questo modo tutte le coppie nome/valore del nostro array associativo potranno essere utilizzate come vere e proprie variabili globali.
Nel prossimo articolo approfondiremo due temi: la ricerca degli elementi in un array associativo e come passare un array associativo ad una procedura.
