La struttura dati della lista è l’ideale se si ha bisogno di lavorare con dei dati di diversa tipologia e numero, ma che hanno un determinato ordine.
Vediamo ora alcuni dei comandi più utili per modificare una lista.
Come concatenare degli argomenti all’interno di una singola lista
Per concatenare più argomenti e formare una nuova lista possiamo utilizzare il comando concat.
# sintassi
concat ?arg1 arg2 ... argn?
Come argomenti possiamo specificare singoli elementi come numeri, parole o stringhe, oppure anche delle liste. Nel caso un argomento sia una lista, o una stringa composta da più parole, la concatenazione estrapolerà i singoli elementi e concatenerà questi ultimi agli elementi della lista. Se però abbiamo delle liste annidate all’interno di una lista, queste vengono considerate come un singolo elemento.
puts "Concatenated list: [concat 3.14 cat "big box" {a b c {d e}}]"
---
Concatenated list: 3.14 cat big box a b c {d e}
Caratteri di spazio multipli
Occorre poi fare una precisazione riguardo ai caratteri di spazio: se nella lista degli argomenti da concatenare ci sono dei caratteri di spazio all’inizio o più caratteri di spazio adiacenti tra gli argomenti, questi caratteri spazio vengono eliminati e gli argomenti vengo inseriti nella lista separati da un singolo carattere di spazio. Se però tra gli argomenti vi sono delle liste che magari al loro interno hanno altre liste, allora Tcl lavora diversamente: come è possibile vedere nell’esempio più sotto dove le sequenze dei caratteri di spazio evidenziate di rosso non subiscono variazioni.
set myNewList [concat a b { c d e} { f { g h}}]
puts "This is my new list: $myNewList"
---
This is my new list: a b c d e f { g h}
Per avere una idea più chiare della logica con cui lavora l’interprete Tcl riguardo l’interpretazione dei caratteri spazio, disponiamo gli argomenti della nostra lista su più livelli.
livello #1 a b { } { }}
livello #2 { c d e} { f { }}
livello #3 { g h}}
Nel livello #1 l’interprete converte sia gli spazi multipli all’inizio di un argomento che quelli tra gli argomenti.
Nel livello #2 l’interprete converte soltanto gli spazi multipli all’inizio di un argomento.
Nel livello #3 l’interprete non opera più alcuna conversione.
Come aggiungere elementi in coda ad una lista
Per aggiungere uno o più elementi ad una lista si usa il comando lappend.
# sintassi
lappend varName ?arg1 arg2 ... argn?
Vediamo un esempio.
set myNewList [concat pippo pluto]
puts "This is my new list: $myNewList"
lappend myNewList paperino {qui quo qua}
puts "This is my new list: $myNewList"
---
This is my new list: pippo pluto
This is my new list: pippo pluto paperino {qui quo qua}
Come inserire elementi in una qualsiasi posizione di una lista
Per inserire degli elementi in una qualsiasi posizione di una lista, si utilizza il comando linsert.
# sintassi
linsert listValue index arg1 ?arg2 ... argn?
Questo comando utilizza come base di partenza la lista listValue e nella posizione specificata dal parametro index inserisce gli argomenti specificati.
Se il valore di index è zero, o minore di zero, allora gli argomenti vengono inseriti all’inizio della lista.
Se il valore di index è pari al valore della costante end, o un numero maggiore rispetto al numero degli elementi della lista originale listValue, allora gli argomenti vengono inseriti alla fine.
set list1 [concat pippo paperino]
puts "List #1: $list1"
set list2 [linsert $list1 1 pluto]
puts "List #2: $list2"
set list3 [linsert $list2 -3 qui]
puts "List #3: $list3"
set list4 [linsert $list3 end quo]
puts "List #4: $list4"
set list5 [linsert $list4 999 qua]
puts "List #4: $list5"
---
List #1: pippo paperino
List #2: pippo pluto paperino
List #3: qui pippo pluto paperino
List #4: qui pippo pluto paperino quo
List #4: qui pippo pluto paperino quo qua
Come sostituire degli elementi in una lista
Per sostituire degli elementi ad una lista si usa il comando lreplace.
# sintassi
lreplace listValue first last ?arg1 ... argn?
Questo comando legge la lista listValue e restituisce una nuova lista dove sono stati inseriti gli argomenti a partire dalla posizione identificata dal parametro first sino alla posizione identificata dal parametro last.
Vediamo un semplice esempio.
set myList {My dog is smart.}
puts "From '$myList' To '[lreplace $myList 1 2 cat isn't]'"
---
From 'My dog is smart.' To 'My cat isn't smart.'
Note:
- Se il valore del parametro
firstè minore o uguale a zero, allora la sostituzione parte dall’inizio della lista. - Se il valore del parametro
firstè maggiore del valore della costanteend, allora il comandolreplacesi comporterà come il comandolappend. - Se il numero degli argomenti da inserire è minore delle posizioni identificate dai parametri
firstelast, allora gli elementi eccedenti verranno scartati.
Come settare degli elementi in una lista
Come alternativa al comando di sostituzione lreplace, che abbiamo visto più sopra, Tcl permette di impostare direttamente il valore di uno o più specifici elementi con il comando lset.
# sintassi
lset listName index newValue
Nel caso di liste annidate, l’indice index dovrà consistere in più valori indice: uno per ciascun livello.
Vediamo un esempio.
set myList {My favourite book is: {Animal Farm}}
puts $myList
lset myList 2 film
lset myList 4 1 House
puts $myList
---
My favourite book is: {Animal Farm}
My favourite film is: {Animal House}
Nel prossimo articolo continueremo a parlare delle liste e vedremo come operare una ricerca all’interno di una lista, come la si può ordinare o come la si può sezionare.
