Indice

Capitolo 9.
Funzioni notevoli




Diamo un occhio alle funzioni notevoli di Perl. Tenete presente nella lettura di questo capitolo che non si vuole dare una descrizione completa di TUTTE le possibili funzioni di Perl, bensì un'assaggio. Per ulteriori informazioni sui comandi trattati o per conoscere altri comandi si rimanda alla lettura della man page di Perl.

     Ricordate che tutte le funzioni qui esposte lavorano su $_ o su @_ oppure @ARGV se non viene specificato uno scalare o un array sul quale operare.


   1. chop e chomp

chop $var elimina dalla variabile specificata (di tipo scalare) l'ultimo carattere. chomp $var invece elimina dalla variabile l'ultimo carattere se questo è un carattere di separazione (spazio o tab) oppure se è un "a capo" (\n). È utile usare chomp sulle righe di testo lette da un file.


chomp Fig. 1
 
    1:  #!/usr/bin/perl
    2: 
    3:  open IN, "/var/log/syslog";
    4:  while (<IN>) {
    5:    chomp;
    6: 
    7:    [ ... ]
    8: 
    9:  }
   10:  close IN;
 




   
2. push, pop, shift, unshift e splice

aggiunge elementi ad un array in coda, mentre li aggiunge in testa. toglie un elemento ad un array dalla coda e lo restituisce, shift fa lo stesso ma lavorando in testa.


push e unshift Fig. 2
 
    1:  #!/usr/bin/perl
    2: 
    3:  push @array, "elem1", "elem2", "elem3";
    4:  while ( @array ) {
    5:    print shift @array, "\n";
    6:  }
 

dà come output
elem1
elem2
elem3
splice @array, OFFSET, LENGTH, LIST elimina (e restituisce) una porzione di un array (iniziante a OFFSET e lunga LENGTH) e la sostituisce con LIST (se fornita).


   
3. defined

defined simbolo ritorna 1 se il simbolo è definito. Si può usare su uno scalare, un array, una hash o una sua chiave, su una subroutine o un filehandle.


defined Fig. 3
 
    1:  #!/usr/bin/perl
    2: 
    3:  if ( defined $ENV{SHELL} ) {
    4:    print "You are using $ENV{SHELL} as shell\n";
    5:  }
 




   
4. open e close -- da concludere

Il comando open apre un canale di comunicazione con un file (filehandle). Attraverso questo canale è possibile leggere e modificare in contenuti di un file, aprire sessioni di un programma e leggere il suo output oppure scrivere il suo input. close invece chiude un canale aperto. I canali lasciati aperti vengono chiusi automaticamente al termine dell'esecuzione anche se è buona pratica chiuderli sempre esplicitamente.

     Questi canali sono chiamati filehandle e sono il primo argomento specificato a open. Proviamo subito a mettere le mani nel codice:


open su /etc/passwd Fig. 4
 
    1:  #!/usr/bin/perl
    2: 
    3:  open PASSWD, "</etc/passwd";
    4:  while (<PASSWD>) {
    5:    print;
    6:  }
    7:  close PASSWD;
 

Questo semplice script apre un filehandle di nome PASSWD sul file /etc/passwd; entra in un ciclo while tale per cui, finché ci sono contenuti nel file, questi vengono posti una riga alla volta in $_ e stampati attraverso print. Al termine di tutto, close chiude il filehandle.

     Il primo argomento di open è il nome del filehandle che vogliamo aprire. Il secondo invece è il nome del file al quale vogliamo collegare a quel filehandle. Avrete notato che prima del nome del file abbiamo specificato un carattere aggiuntivo (<) che indica che il file deve essere aperto in sola lettura. Ne esistono altri che elenchiamo qui:


Possibili aperture di un file o di un processo Tabella 1
Operatore Posizione Significato
     
< Inizio Apre il file in lettura
> Inizio Apre il file in scrittura
| Inizio Apre una pipe a un comando e ne scrive l'input
| Fine Apre una pipe a un comando e ne legge l'output

ATTENZIONE: non è possibile scrivere e leggere da un pipe contemporaneamente usando un filehandle aperto con open!!!


   
5. unlink, mkdir, chmod

Perl ha un nutrito numero di subroutine che emulano i corrispettivi comandi UNIX per cancellare file, creare directory, cambiare i permessi ad un file e così via.


Comandi per i file Fig. 5
 
    1:  #!/usr/bin/perl
    2: 
    3:  unlink "/var/lock/daemon.lock";
    4:  mkdir "/var/lock/daemon/";
    5:  open OUT, ">/var/lock/daemon/lock";
    6:  print OUT 1;
    7:  close OUT;
    8:  chmod 0755 "/var/local/daemon/lock";
 




   
6. split e join

split divide una stringa arbitraria di testo in una lista, usando il primo parametro come separatore.


split Fig. 6
 
    1:  #!/usr/bin/perl
    2: 
    3:  my $string = "Corso di   Perl";
    4:  my @array = split / +/, $string;
 

Notate come il primo parametro sia stato messo fra slash! Questo perché in realtà è una Regular Expression (questa in particolare significa uno o più caratteri di spazio).

     join al contrario unisce un array o una lista di elementi con una sequenza di caratteri (il primo parametro).


join Fig. 7
 
    1:  #!/usr/bin/perl
    2: 
    3:  my @array = ( 'uno', 'due', 'tre' );
    4:  my $string = join ", ", @array;
 

Attenzione: join è sufficientemente furbo da evitare di aggiungere il pattern di giunzione anche dopo l'ultimo elemento. Non serve quindi toglierlo con una regexpr o una serie di chop.


   
7. keys e values

La keyword keys consente di ottenere un array contenente tutte le chiavi di una hash. In questo modo è possibile esplorare il contenuto di una hash. values per contro restituisce un array contenente tutti i valori della hash specificata. Ricordate sempre che tanto le chiavi quanto i valori non hanno nessuna presunzione di ordinamento. Per ordinarli si può utilizzare il comando sort:


keys e sort Fig. 8
 
    1:  #!/usr/bin/perl
    2: 
    3:  %h = (
    4:    italy => 'pizza',
    5:    france => 'crepes',
    6:    germany => 'wurstel',
    7:  );
    8: 
    9:  for my $key ( sort keys %h ) {
   10:    print "$key is associated to " . $h{$k} . "\n";
   11:  }
 




   
8. delete

delete cancella una chiave da una hash.


delete Fig. 9
 
    1:  #!/usr/bin/perl
    2: 
    3:  delete $ENV{SHELL};
 




   
9. die e exit

die ed exit terminano entrambe l'esecuzione del programma. La differenza fra le due risiede nel fatto che die consente di comunicare all'utente un messaggio testuale mentr exit ritorna solo un codice numerico di errore.


die ed exit Fig. 10
 
    1:  #!/usr/bin/perl
    2: 
    3:  print "Dammi il limite superiore della serie: ";
    4:  my $int = <STDIN>;
    5:  chomp $int;
    6:  $int =~ /^\d+$/ or die "\$int non e' valido!\n";
    7: 
    8:  for $f ( 0 .. $int ) {
    9:    print $f, "\n";
   10:  }
   11: 
   12:  exit(0);
 

$int contiene il limite alto della serie che inizia da zero e viene stampata in sequenza. Se la variabile non contiene un numero il programma termina la sua esecuzione con l'uso di die. Dopo aver eseguito tutto il ciclo for il programma termina esplicitamente la sua esecuzione mediante una chiamata a exit alla quale passa un numero intero che costituisce il suo exit status, ovvero un codice che indica numericamente se il processo è terminato correttamente o, in caso contrario, quale errore abbia incontrato.



Inizio Capitolo Indice