Unless
Terminiamo la lista delle strutture di controllo con unless.
Lho 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 questultima
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, loperatore
not: serve ad invertire il valore vero/falso di unespressione
(esattamente come in C). Se $a >=10 è vera, allora
! $a>=10 è falsa.
Aggiungere loperatore not oppure cambiare lif
in unless dà esattamente lo stesso risultato. Possiamo vedere
unless come una scorciatoia per non fare troppe inversioni, che
tra laltro 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
lauto-ciclizzazione, ottenuta con le parentesi graffe
loperatore 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, loperatore virgola
ci permette di unire i due comandi print e last, in
modo da uscire dal blocco non appena stampata la stringa.
Luscita anticipata non è sempre necessaria (le altre istruzioni
verrebbero saltate comunque, visto che per loro la condizione è
falsa), ma ci permette di aggiungere lultima 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 lespressione
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 unaltra
sezione: quella su come aprire/leggere/scrivere files.
Torna all'indice Generale del corso di Corso di Perl di Software Planet