Quando sei di corsa ed entri nei bagni dell’Autogrill, hai pochi secondi per decidere qual è la porta giusta, e non è il caso di sbagliare!

Stessa situazione la troviamo quando scriviamo il nostro codice.

In Tcl ci viene in aiuto il comando switch che permette di operare una scelta tra più possibilità.

Il confronto avviene solo ed esclusivamente tra stringhe.

Quando una certa stringa da confrontare corrisponde con una delle diverse stringhe di controllo, allora viene eseguito il relativo codice associato.

Di norma è bene scegliere la struttura di controllo switch al posto di quella if-then-else quando abbiamo un numero abbastanza consistente di possibilità su cui lavorare.

Vediamo la sintassi del comando switch.

switch ?opzioni? stringa_da_confrontare {
    stringa_di_controllo_1 {
        codice_blocco_1
    }
    stringa_di_controllo_2 {
        codice_blocco_2
    }
    ...
    stringa_di_controllo_n {
        codice_blocco_n
    }
    default {
        codice_blocco_default
    }
}

Alcune note per punti:

  • Le opzioni subito dopo il comando switch sono facoltative.
  • Viene eseguito soltanto il blocco di codice relativo alla prima stringa di controllo che corrisponde alla stringa da confrontare.
  • Se tutti i confronti con le stringhe di controllo falliscono, allora viene eseguito il codice relativo alla stringa default se questa è presente.
  • Se il blocco relativo alla stringa default non è stato previsto, e tutti i confronti falliscono, allora il comando switch restituisce una stringa vuota "".
  • Se al posto del codice di un blocco inseriamo il carattere - (trattino), allora nel caso che la relativa stringa di controllo corrisponda alla stringa da confrontare, l’interprete passa alla valutazione del blocco successivo.

Usare le opzioni

Come abbiamo scritto più sopra, le opzioni sono facoltative, ma, se usate, ci permettono di definire la modalità di interpretazione delle stringhe di controllo.

Vediamo alcune opzioni:

  • se utilizziamo l’opzione -glob, l’interprete utilizzerà le regole standard come quella relativa al carattere asterisco * che ci permette di confrontare, per esempio, le stringhe “pluto”, “plutone” o “pluto 2” e trovare una corrispondenza positiva con la stringa “pluto*”;
  • se utilizziamo l’opzione -exact, la stringa di controllo dovrà corrispondere esattamente alla stringa da confrontare;
  • se per il confronto utilizziamo l’opzione -regexp, l’interprete utilizzerà le regole definite dalle Regular Expressions che vedremo più avanti.

Esempi

Vediamo uno stesso esempio una volta con l’opzione -glob ed una con l’opzione -exact.

Primo esempio

set x "pluto 2"
switch -glob $x {
    "pippo" {
        puts "The value of x is $x."
    }
    "pluto*" {
        puts "The value of x is $x."
    }
    "paperino" {
        puts "The value of x is $x."
    }
    default {
        puts "The value of x is not managed."
    }
}
---
The value of x is pluto 2.

Secondo esempio

set x "pluto 2"
switch -exact $x {
    "pippo" {
        puts "The value of x is $x."
    }
    "pluto*" {
        puts "The value of x is $x."
    }
    "paperino" {
        puts "The value of x is $x."
    }
    default {
        puts "The value of x is not managed."
    }
}
---
The value of x is not managed.

Nel prossimo articolo vedremo la struttura di controllo iterativa while.