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

Strumenti personali