Perl/Istruzioni: differenze tra le versioni

Wikibooks, manuali e libri di testo liberi.
Contenuto cancellato Contenuto aggiunto
Nuova pagina: {{Linguaggio Perl}} Le istruzioni sono quei costrutti sintattici che consentono ad un linguaggio di controllare, gestire, manipolare. Quando un programma svolge un compito , esegue in...
(Nessuna differenza)

Versione delle 15:23, 6 dic 2006

Template:Linguaggio Perl

Le istruzioni sono quei costrutti sintattici che consentono ad un linguaggio di controllare, gestire, manipolare. Quando un programma svolge un compito , esegue innumerevoli operazioni che il programmatore deve essere in grado di controllare e gestire. Ecco in breve le istruzioni "fondamentali" che consentono di realizzare un programma.

minime

con questo termine intendo indicare le istruzioni più semplici, come quelle che abbiamo usato fin'ora. Per esempio :

$a = 3;
@a = ( 1, 2, 3);
%a = ( 1 => 2 , 3 => 4 );

racchiuse o blocco

per blocco si intendono tutte quelle istruzioni comprese fra { e }.Ai fini pratici i blocchi individuano un gruppo di istruzioni.

{
  $a = 3;
  @a = ( 1, 2, 3);
  %a = ( 1 => 2 , 3 => 4 );
}

NOTA:la differenza fra un blocco e la definizione di un hash è evidente:l'hash deve avere un $,un"nome" ed una chiave fra {}, mentre il blocco non ha $,non ha nome e al suo interno sono presenti istruzioni.


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


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.

E' 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. E' 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: E' 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

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

I CICLI

I cicli sono una serie di "azioni" ripetute "fino a" o "un certo numero di volte". le azioni sono contenute in un blocco.Ogni volta che si esegue un blocco viene detto "iterazione". Ognuno di questi costrutti ha un elemento decisionale che serve a determinare la fine del ciclo. NOTA: non è obbligatorio che in ciclo finisca.

for

Il ciclo for è quello più comune a molti linguaggi. Da questo è possibile ottenere delle altre tipologie ma nell'uso generale si preferisce utilizzarlo quando il numero di iterazioni è noto.La sua sintassi è la seguente: for ( inizio ; condizione ; incremento ) {

  ... istruzioni

}

vediamo un esempio:

my $max_valore = 10;

my $b;
for ( $b = 0 ; $b < $max_valore ; $b++ )
{
   print "iterazione numero $b\n";
}
print "b=$b\n";

che produrrà :

iterazione numero 0
iterazione numero 1
iterazione numero 2
iterazione numero 3
iterazione numero 4
iterazione numero 5
iterazione numero 6
iterazione numero 7
iterazione numero 8
iterazione numero 9
b=10

vediamo ora che cosa succede se togliamo la condizione (CTRL+C per fermare):

my $b;
for ( $b = 0 ;  ; $b++ )
{
   print "iterazione numero $b\n";
}
print "Ultima iterazione numero $b\n";

Sorpresi ? se non c'è una condizione che ferma il ciclo (o se questa non si verifica mai!) il ciclo continua indefinitamente!

vediamo ora che cosa succede se togliamo l'incremento (CTRL+C per fermare):

my $max_valore = 10;

my $b;
for ( $b = 0 ; $b < $max_valore ; )
{
   print "iterazione numero $b\n";
}
print "b=$b\n";

Sorpresi ? se non c'è un incremento la condizione che ferma il ciclo sarà sempre vera qundi il ciclo continua indefinitamente!

vediamo ora che cosa succede se togliamo l'inizio :

my $max_valore = 10;

my $b;
for ( ; $b < $max_valore ; $b++ )
{
   print "iterazione numero $b\n";
}
print "b=$b\n";

che produrrà:

iterazione numero   
iterazione numero 1 
iterazione numero 2 
iterazione numero 3 
iterazione numero 4 
iterazione numero 5 
iterazione numero 6 
iterazione numero 7 
iterazione numero 8 
iterazione numero 9 
b=10

Come si vede , mancando un valore iniziale a $b è stato messo il valore undef che nel caso della condizione viene posto a uguale al valore 0 mentre nel caso della stringa viene posto uguale al valore "".Dopo la prima iterazione dal valore undef diventa 1 per effetto della chiamata $b++ e poi si incrementa.