Perl/Istruzioni decisionali

Wikibooks, manuali e libri di testo liberi.
Indice del libro


Istruzioni Decisionali[modifica]

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 si potrebbero 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 );


if, elsif, else[modifica]

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"; 
         }
       }
     }
   }
 }

unless , else[modifica]

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; }

Ma il comodo Switch ?[modifica]

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 ...