Perl/Istruzioni decisionali
Wikibooks, manuali e libri di testo liberi.
Indice |
[modifica] Decisionali
Per decisionali si intende quelle istruzioni che a seguito di una condizione consentono di far fare o meno una parte di istruzioni. Facciamo un esempio: un uomo nasce, cresce e muore.Durante la crescita passa da bambino, ragazzo , giovane, adulto, vecchio, anziano. Per puro esempio stabiliamo che l'età sia l'unico parametro che faccia passare da una definizione all'altra. Pertanto di potrebbe definire queste soglie: bambino fino a 14, ragazzo da 14 a 17 , giovane da 17 a 23, adulto da 23 a 60, vecchio da 60 a 75, anziano oltre 75
%stadio = ( bambino => 14 , ragazzo => 17 , giovane => 23 , adulto => 60 , vecchio => 75 );
[modifica] if, elsif, else
l'istruzione if () è una decisionale "spartiacque" cioè divide l'esecuzione del programma in "quella parte che verifica la condizione" e "quella parte che non la verifica". Nel mezzo delle parentesi ( e ) va posta la condizione:
%stadio = ( bambino => 14 , ragazzo => 17 , giovane => 23 , adulto => 60 , vecchio => 75 ); $eta_ora = 27; print "all'eta' di $eta_ora sei un bambino \n" if ( $eta_ora < 14 ) ; # ma meglio: print "all'eta' di $eta_ora sei un bambino \n" if ( $eta_ora < $stadio{bambino} ) ;
L'istruzione di print verrà eseguita SOLO se $eta_ora sarà minore di 14 . NOTA: il punto e virgola a indicare la fine dell'istruzione.Inoltre all'if (se usato in fondo) si può associare SOLO una istruzione.
È possibile associare un blocco all'istruzione di if:
$eta_ora = 27; if ( $eta_ora < $stadio{bambino} ) { print "all'eta' di $eta_ora sei un bambino \n"; }
NOTA: Ora il punto e virgola non c'è perché le istruzioni sono dentro ad un blocco. Occorre poter distinguere una istruzione (anche se condizionale) ed un blocco associato ad una condizione. È possibile inoltre associare più verifiche utilizzando il costrutto elsif:
%stadio = ( bambino => 14 , ragazzo => 17 , giovane => 23 , adulto => 60 , vecchio => 75 ); $eta_ora = 27; if ( $eta_ora >= $stadio{vecchio} ) { print "all'eta' di $eta_ora sei un anziano \n"; } elsif ( $eta_ora >= $stadio{adulto} ) { print "all'eta' di $eta_ora sei un vecchio \n"; } elsif ( $eta_ora >= $stadio{giovane} ) { print "all'eta' di $eta_ora sei un adulto \n"; } elsif ( $eta_ora >= $stadio{ragazzo} ) { print "all'eta' di $eta_ora sei un giovane \n"; } elsif ( $eta_ora >= $stadio{bambino} ) { print "all'eta' di $eta_ora sei un ragazzo \n"; } elsif ( $eta_ora >= 0 ) { print "all'eta' di $eta_ora sei un bambino \n"; }
Esiste anche un'altra forma più elegante :
%stadio = ( bambino => 14 , ragazzo => 17 , giovane => 23 , adulto => 60 , vecchio => 75 ); $eta_ora = 27; if ( $eta_ora >= $stadio{vecchio} ) { print "all'eta' di $eta_ora sei un anziano \n"; } elsif ( $eta_ora >= $stadio{adulto} ) { print "all'eta' di $eta_ora sei un vecchio \n"; } elsif ( $eta_ora >= $stadio{giovane} ) { print "all'eta' di $eta_ora sei un adulto \n"; } elsif ( $eta_ora >= $stadio{ragazzo} ) { print "all'eta' di $eta_ora sei un giovane \n"; } elsif ( $eta_ora >= $stadio{bambino} ) { print "all'eta' di $eta_ora sei un ragazzo \n"; } else { print "all'eta' di $eta_ora sei un bambino \n"; }
Il caso else viene eseguito se tutte le condizioni precedenti NON sono state verificate.Il caso else DEVE essere l'ultimo. NOTA: È possibile includere il caso else senza alcuna clausula elsif.Per esempio si sarebbe potuto scrivere:
%stadio = ( bambino => 14 , ragazzo => 17 , giovane => 23 , adulto => 60 , vecchio => 75 ); $eta_ora = 27; if ( $eta_ora >= $stadio{vecchio} ) { print "all'eta' di $eta_ora sei un anziano \n"; } else { if ( $eta_ora >= $stadio{adulto} ) { print "all'eta' di $eta_ora sei un vecchio \n"; } else { if ( $eta_ora >= $stadio{giovane} ) { print "all'eta' di $eta_ora sei un adulto \n"; } else { if ( $eta_ora >= $stadio{ragazzo} ) { print "all'eta' di $eta_ora sei un giovane \n"; } else { if ( $eta_ora >= $stadio{bambino} ) { print "all'eta' di $eta_ora sei un ragazzo \n"; } else { print "all'eta' di $eta_ora sei un bambino \n"; } } } } }
[modifica] unless , else
Unless è un if al "contrario" cioè se NON si verifica la condizione allora viene eseguito. Vediamo gli esempi precedenti con unless (dove è possibile applicarli).
%stadio = ( bambino => 14 , ragazzo => 17 , giovane => 23 , adulto => 60 , vecchio => 75 ); $eta_ora = 27; print "all'eta' di $eta_ora NON sei un bambino \n" unless ( $eta_ora < 14 ) ; print "all'eta' di $eta_ora NON sei un bambino \n" unless ( $eta_ora < $stadio{bambino} ) ;
NOTA: il punto e virgola a indicare la fine dell'istruzione.Inoltre all'unless (se usato in fondo) si può associare SOLO una istruzione.
unless ( $eta_ora < $stadio{bambino} ) { print "all'eta' di $eta_ora NON sei un bambino \n"; }
NOTA: a differenza di if , unless non ha un "elsunless" ne tantomeno "elsif"
%stadio = ( bambino => 14 , ragazzo => 17 , giovane => 23 , adulto => 60 , vecchio => 75 ); $eta_ora = 27; unless ( $eta_ora > $stadio{bambino} ) { print "all'eta' di $eta_ora sei un bambino \n"; } else { unless ( $eta_ora > $stadio{ragazzo} ) { print "all'eta' di $eta_ora sei un ragazzo \n"; } else { unless ( $eta_ora > $stadio{giovane} ) { print "all'eta' di $eta_ora sei un giovane \n"; } else { unless ( $eta_ora > $stadio{adulto} ) { print "all'eta' di $eta_ora sei un adulto \n"; } else { unless ( $eta_ora > $stadio{anziano} ) { print "all'eta' di $eta_ora sei un anziano \n"; } else { print "all'eta' di $eta_ora sei un vecchio \n"; } } } } }
NOTA:unless è utile per le funzioni es:
unless ( open ( FILE , "<pippo.txt" ) ) { print "non posso aprire pippo.txt"; exit 10; }
[modifica] Ma il comodo Switch ?
Purtroppo in modo "nativo" non esiste un costrutto switch ma l'autore del linguaggio propone questa soluzione utilizzando le etichette ed i blocchi :
my $a = "aaa"; my $trovata = 0; # se trovata = 1 allora è stata trovata ! SWITCH: { if ( $a eq "aaa") { $trovata = 1; last SWITCH; } if ( $a eq "AAA") { $trovata = 1; last SWITCH; } $trovata = 0; } print $trovata."\n";
E quindi : si definisce un blocco con l'etichetta SWITCH se viene soddisfatta la condizione "aaa" o "AAA" allora viene impostata $trovata a 1 e quindi si esce con l'istruzione last SWITCH.
Se non viene trovata , la variabile $trovata viene messa a 0 (lo era già ma meglio indicarlo in modo esplicito). Si sarebbe potuto scrivere:
my $a = "aaa"; my $trovata = 0; # se trovata = 1 allora è stata trovata ! if ( $a eq "aaa") { $trovata = 1; } elsif ( $a eq "AAA") { $trovata = 1; last SWITCH; } else { $trovata = 0; } print $trovata."\n";
Tuttavia è sicuramente più immediata la prima forma.
Anche in questo caso è emerso che in Perl è possibile scrivere in più forme una istruzione ...