Corso di Perl

Strutture di controllo: Unless, switch

 

Unless

Terminiamo la lista delle strutture di controllo con unless. L’ho lasciata per ultima perché è poco usata, anche se a rigor di logica avrebbe dovuto stare tra le prime posizioni: infatti, ha esattamente il significato contrario di if: se quest’ultima esegue il blocco solo se la condizione è vera, con unless il blocco viene eseguito solo se la condizione è falsa:

unless ($a>=10)
      {
      print “$a è minore di 10\n”;
      }


Unless in inglese significa “se non”, “a meno che”. Come vedete, il suo significato viene rispettato.

Scegliere tra if e unless spesso è questione di gusti: il codice qui sopra può essere riscritto in questo modo:

if ($a<10)
      {
      print “$a è minore di 10\n”;
      }


oppure anche:

if (! $a>=10)
      {
      print “$a è minore di 10\n”;
      }


dove il “!” è un operatore speciale, l’operatore not: serve ad invertire il valore vero/falso di un’espressione (esattamente come in C). Se “$a >=10” è vera, allora “ ! $a>=10” è falsa.

Aggiungere l’operatore not oppure cambiare l’if in unless dà esattamente lo stesso risultato. Possiamo vedere unless come una scorciatoia per non fare troppe inversioni, che tra l’altro sono poco visibili e possono portarci a fare errori.

Ovviamente, anche per unless vale la forma abbreviata, su una linea sola:

print “$a è minore di 10\n” unless $a>=10;

che fa esattamente la stessa cosa di prima.

Come fare uno switch

Se conoscete il C, avete sicuramente presente la parola chiave “switch”. E, avendo ritrovato tutte le vostre familiari strutture di controllo anche nel Perl, vi chiederete se ne esista una equivalente. La risposta e’ sì, ma non nel modo in cui pensate:

BLOCK: {
      print “Caso1n”, last BLOCK if $a==1;
      print “Caso2n”, last BLOCK if $a==2;
      print “Caso3n”, last BLOCK if $a==3;
      print “Nessuno dei 3\n”;
      }

Un po’ strano, vero? Per i non iniziati, uno switch è una struttura di controllo che contiene vari pezzi di codice. Ad ogni pezzo di codice è associata una condizione (in genere, che una variabile abbia un certo valore). Verrà eseguito solo il pezzo di codice per cui la condizione è vera.
Qui abbiamo realizzato uno switch usando numerose caratteristiche del perl:

le label di blocco
gli if abbreviati
l’auto-ciclizzazione, ottenuta con le parentesi graffe
l’operatore virgola, che permette di unire due comandi dove ce ne starebbe uno solo (come in C).

Notate  come ogni linea sia un if abbreviato: verrà eseguita solo se la condizione è vera. Inoltre, l’operatore virgola ci permette di unire i due comandi print e last, in modo da uscire dal blocco non appena stampata la stringa.

L’uscita anticipata non è sempre necessaria (le altre istruzioni verrebbero saltate comunque, visto che per loro la condizione è falsa), ma ci permette di aggiungere l’ultima linea senza condizione: questa è la linea che viene eseguita se nessuna delle condizioni precedenti era vera.

Naturalmente i pezzi di codice non sono limitati ad una sola linea, ma in questo caso la struttura si fa più complicata:

BLOCK: {
      if ($a==1)
            {
            print “Caso1\n”;
            print “Bla bla bla\n”;
            last BLOCK;
            }
      if ($a==2)
            {
            print “Caso2\n”;
            print “Bla bla bla\n”;
            last BLOCK;
            }
      print “Nessuno dei due\n”;
      print “$a non era né 1 né 2\n”;
      }

Ci sono molti altri modi di realizzare una struttura simile allo switch, e il capitolo “perlsyn” della guida in linea ve li mostra. Qui mi limiterò a farvi notare che, se in C la condizione è limitata al valore che assume una certa variabile, in Perl l’espressione può essere quella che vi pare, come in questo esempio:

CHECK:
      {
      print “Troppo piccolo\n”, last CHECK if $a<10;
      print “Troppo grande\n”, last CHECK if $a>20;
      print “Giusto\n”;
      }


che scrive “Giusto” se $a è compreso tra 10 e 20.

Finisce qui la sezione delle strutture di controllo (francamente, stavano iniziando ad annoiarci). Dalla prossima lezione inizia un’altra sezione: quella su come aprire/leggere/scrivere files.

 

Torna all'indice Generale del corso di Corso di Perl di Software Planet