[successivo] [precedente] [inizio] [fine] [indice generale] [indice analitico]


Capitolo 7.   Perl: funzioni interne

Nelle sezioni seguenti viene descritto brevemente il funzionamento di alcune funzioni interne di Perl. La sintassi viene mostrata secondo lo stile della documentazione di Perl, per cui, blocco rappresenta un gruppo di istruzioni nella forma consueta di Perl, e lista rappresenta un elenco di espressioni separate da virgole.

blocco equivale a:

{  istruzione ... }

lista equivale a:

espressione1 ,  espressione2 , ...

Le funzioni descritte sono raggruppate in base al tipo di situazione in cui vengono utilizzate normalmente.

7.1   File

Nelle sezioni seguenti vengono elencate alcune funzioni che riguardano la gestione dei file, nel senso globale, esterno. Le funzioni per la gestione del contenuto dei file vengono descritte più avanti.

Nome Descrizione.
- xTest sui file.
chmod() Cambia i permessi.
chown() Cambia l'utente e il gruppo proprietari.
link() Crea un collegamento fisico.
lstat() Restituisce le informazioni sui collegamenti simbolici.
readlink() Restituisce il valore di un collegamento simbolico.
rename() Cambia il nome di un file.
stat() Restituisce le informazioni su un file.
symlink() Crea un collegamento simbolico.
unlink() Cancella i file.
utime() Modifica la data di accesso e di modifica dei file.

Tabella 7.1. Elenco di alcune funzioni riferite alle operazioni sui file.

7.1.1   Test sui file

Perl permette di effettuare una serie di test sui file in modo analogo a quanto si fa con le shell tradizionali. La sintassi è esprimibile nei due modi seguenti.

- x   nome_file
- x   flusso

Nel primo caso si fa riferimento a un file indicato per nome, nel secondo il riferimento è a un flusso di file. La lettera  x  cambia a seconda del tipo di test da verificare. La tabella 7.2 mostra l'elenco di questi test.

Test Significato.
-r Il file è accessibile in lettura dal UID/GID efficace.
-w Il file è accessibile in scrittura dal UID/GID efficace.
-x Il file è accessibile in esecuzione dal UID/GID efficace.
-o Il file appartiene al UID efficace.
-R Il file è accessibile in lettura dal UID/GID reale.
-W Il file è accessibile in scrittura dal UID/GID reale.
-X Il file è accessibile in esecuzione dal UID/GID reale.
-O Il file appartiene al UID reale.
-e Il file esiste.
-z Il file ha dimensione zero.
-s Il file ha una dimensione maggiore di zero (restituisce la dimensione).
-f Si tratta di un file normale.
-d Si tratta di una directory.
-l Si tratta di un collegamento simbolico.
-p Si tratta di una pipe con nome.
-S Si tratta di un socket.
-b Si tratta di file di dispositivo a blocchi.
-c Si tratta di file di dispositivo a caratteri.
-t Si tratta di un flusso di file aperto su un terminale.
-u Il file ha il bit SUID attivo.
-g Il file ha il bit SGID attivo.
-k Il file ha il bit Sticky attivo.
-T Si tratta di un file di testo.
-B Si tratta di un file binario.
-M Restituisce quanto tempo ha il file in base alla data di modifica.
-A Restituisce quanto tempo ha il file in base alla data di accesso.
-C Restituisce quanto tempo ha il file in base alla data di creazione.

Tabella 7.2. Elenco dei test - x.

I vari test restituiscono il valore uno se si verificano, oppure la stringa nulla in caso contrario. A questo ci sono delle eccezioni che sono indicate nella tabella.

Esempi
if (-x "esempio.pl")
  {
    print "Il file è eseguibile\n";
  }

Restituisce il messaggio se il file esempio.pl è eseguibile.

7.1.2   chmod()

chmod  permessi ,  file , ...

chmod() cambia i permessi dei file indicati come argomento. In particolare, l'argomento è una lista, in cui il primo elemento è costituito dai permessi espressi in forma numerica ottale. Dal momento che si tratta di un numero ottale, è bene che non sia fornito in forma di stringa perché la conversione da stringa a numero ottale non è automatica. Restituisce il numero di file su cui ha potuto intervenire con successo.

Esempi
chmod 0755, 'mio_file', 'tuo_file', 'suo_file';

Cambia i permessi ai file indicati dopo la modalità.

@elenco = ('mio_file', 'tuo_file', 'suo_file');
chmod 0755, @elenco;

Esattamente come nell'esempio precedente.

@elenco = ('mio_file', 'tuo_file', 'suo_file');
chmod (0755, @elenco);

Esattamente come nell'esempio precedente, ma più simile alle chiamate di funzione degli altri linguaggi.

7.1.3   chown()

chown  uid ,  gid ,  file , ...

chown() cambia i permessi dei file indicati nella lista di argomenti. I primi due elementi della lista sono rispettivamente il numero UID e GID. Gli elementi restanti sono i file su cui si vuole intervenire. Restituisce il numero di file su cui ha potuto intervenire con successo.

Esempi
chown 1001, 100, 'mio_file', 'tuo_file', 'suo_file';

Cambia l'utente e il gruppo proprietari dei file mio_file, tuo_file e suo_file.

chown (1001, 100, 'mio_file', 'tuo_file', 'suo_file');

Esattamente come nell'esempio precedente.

7.1.4   link()

link  file_di_origine , collegamento_di_destinazione

link() genera un collegamento fisico a partire da un file esistente. Restituisce Vero se la creazione ha successo.

7.1.5   lstat()

lstat  file
lstat  flusso

lstat() funziona esattamente come stat(), con la differenza che restituisce le informazioni relative a un collegamento simbolico, invece di quelle del file a cui questo punta. Se non viene indicato l'argomento, lstat() utilizza il contenuto della variabile predefinite $_.

7.1.6   readlink()

readlink  file

readlink() restituisce il valore di un collegamento simbolico. Se non viene indicato l'argomento, readlink() utilizza il contenuto della variabile predefinita $_.

Esempi
$prova = readlink '/bin/sh';

Assegna alla variabile $prova il percorso contenuto nel collegamento simbolico /bin/sh. Probabilmente, alla fine, la variabile conterrà la stringa bash.

7.1.7   rename()

rename  nome_vecchio , nome_nuovo

rename() cambia il nome di un file, o lo sposta. Tuttavia, lo spostamento non può avvenire al di fuori del file system di partenza. Restituisce uno se l'operazione riesce, altrimenti zero.

7.1.8   stat()

stat  file
stat  flusso

stat() restituisce un array di tredici elementi contenenti tutte le informazioni sul file indicato per nome o attraverso un flusso di file. Se non viene indicato l'argomento, stat() utilizza il contenuto della variabile predefinita $_.

Gli elementi dell'array restituito sono riportati nella tabella 7.3 in cui appare anche il nome suggerito per la trasformazione in variabili scalari.

Elemento Nome consueto Descrizione.
0 $dev Numero del dispositivo del file system.
1 $ino Numero dell'inode.
2 $mode Permessi del file.
3 $nlink Numero di collegamenti fisici al file.
4 $uid UID dell'utente proprietario del file.
5 $gid GID del gruppo proprietario del file.
6 $rdev Identificatore di dispositivo, per i file speciali.
7 $size Dimensione in byte.
8 $atime Data dell'ultimo accesso.
9 $mtime Data dell'ultima modifica.
10 $ctime Data di cambiamento di inode.
11 $blksize Dimensione preferita dei blocchi per le operazioni di I/O del sistema.
12 $blocks Numero di blocchi allocati attualmente.

Tabella 7.3. Elenco degli elementi componenti l'array restituito da stat().

Va osservato che le informazioni data-orario sui file sono espresse in forma numerica che esprime il tempo trascorso a partire dalla data di riferimento del sistema operativo. Nel caso dei sistemi derivati da Unix si tratta dell'ora zero del 1/1/1970. Nello stesso modo, è evidente che tutte queste informazioni possono essere ottenute solo da un file system che può gestirle.

Esempi
($dev, $ino, $mode, $nlink,
 $uid, $gid, $rdev, $size,
 $atime, $mtime, $ctime,
 $blksize, $blocks) = stat ('/home/tizio/mio_file');

Preleva tutte le informazioni sul file /home/tizio/mio_file e le scompone in diverse variabili scalari.

7.1.9   symlink()

symlink  file_di_origine , collegamento_di_destinazione

symlink() genera un collegamento simbolico a partire da un file esistente. Restituisce Vero se la creazione ha successo.

7.1.10   unlink()

unlink  lista_di_file

unlink() cancella i file indicati per nome tra gli argomenti. Generalmente non possono essere cancellate le directory (e comunque sarebbe inopportuno dato il tipo di cancellazione che si fa). Restituisce il numero di file cancellati con successo. Se non viene indicato l'argomento, unlink() utilizza il contenuto della variabile predefinita $_.

7.1.11   utime()

utime  data_di_accesso , data_di_modifica , lista_di_file

utime() cambia la data di modifica e di accesso di una serie di file. Le date, indicate come argomenti iniziali, sono espresse nella forma numerica gestita dal sistema operativo. La data di modifica dell'inode viene cambiata automaticamente in modo che corrisponda al momento in cui questa modifica viene effettuata.

Esempi
$momento = time;
utime $momento, $momento, 'mio_file';

Cambia la data di accesso e modifica in modo da farle coincidere con quella riportata dall'orologio dell'elaboratore nel momento in cui si eseguono queste istruzioni.

7.2   Directory

Nelle sezioni seguenti vengono elencate alcune funzioni che riguardano la gestione delle directory e di raggruppamenti di file. Vengono ignorate volutamente le funzioni specifiche di Perl per la lettura delle directory.

Nome Descrizione.
chdir() Cambia la directory di lavoro.
glob() Espande un modello fatto attraverso l'uso di caratteri jolly.
mkdir() Crea una directory.
rmdir() Cancella una directory vuota.

Tabella 7.4. Elenco di alcune funzioni riferite alle operazioni sulle directory.

7.2.1   chdir()

chdir  directory

chdir() cambia la directory di lavoro posizionandosi in corrispondenza di quanto indicato come argomento. Se l'argomento viene omesso, lo spostamento avviene nella directory personale, attraverso quanto determinato dal contenuto di $ENV{"HOME"}. Restituisce Vero se l'operazione ha successo, Falso in tutti gli altri casi.

7.2.2   glob()

glob  espressione

glob() restituisce quanto indicato nell'argomento dopo un'operazione di espansione, come farebbe una shell. Se l'argomento non viene indicato, l'espansione viene effettuata sul contenuto della variabile $_.

Esempi
$primo = glob ("/bin/*");

Assegna alla variabile $primo il percorso assoluto del primo file che viene trovato attraverso l'espansione del modello /bin/*.

@elenco = glob ("/bin/*");

Assegna all'array @elenco i percorsi assoluti dei file che vengono trovati attraverso l'espansione del modello /bin/*.

7.2.3   mkdir()

mkdir  directory ,  permessi

mkdir() crea la directory indicata come primo argomento. I permessi della directory sono indicati come secondo argomento, devono essere espressi con un numero ottale e risulteranno filtrati ulteriormente dalla maschera dei permessi. Restituisce uno se l'operazione riesce, altrimenti zero, impostando anche la variabile $!.

In generale, non dovrebbe essere possibile assegnare dei permessi negli S-bit. In pratica dovrebbe essere consentito di operare solo con i soliti permessi di lettura, scrittura ed esecuzione (attraversamento).

Esempi
mkdir ("/tmp/prova");

Crea la directory /tmp/prova/ con i permessi normali dell'utente.(1)

mkdir ("/tmp/prova", 0755);

Crea la directory /tmp/prova/ con i permessi 07558 (si osservi che si tratta di un numero ottale), che vengono comunque filtrati dalla maschera dei permessi.

7.2.4   rmdir()

rmdir  directory

rmdir() elimina la directory indicata come argomento. Se l'argomento non viene fornito, si utilizza la variabile predefinita $_. Restituisce uno se l'operazione riesce, altrimenti zero, impostando anche la variabile $!.

7.3   I/O

Nelle sezioni seguenti vengono elencate alcune funzioni che riguardano la gestione dei dati contenuti nei file.

Nome Descrizione.
binmode() Attiva la modalità binaria di lettura e scrittura.
chomp() Elimina il codice di interruzione di riga finale.
chop() Elimina l'ultimo carattere di una stringa.
close() Chiude un flusso di file.
eof() Verifica la conclusione del file.
fcntl() Esegue la chiamata della funzione di sistema omonima.
fileno() Restituisce il descrittore di un file aperto.
flock() Esegue la chiamata di sistema omonima.
getc() Legge un carattere alla volta.
ioctl() Esegue la chiamata di sistema omonima.
open() Apre un file e gli associa un flusso di file.
pipe() Esegue la chiamata di sistema omonima.
print() Scrive all'interno di un flusso di file.
printf() Scrive all'interno di un flusso di file utilizzando sprintf().
read() Legge un file.
seek() Sposta il puntatore interno a un file aperto.
select() Definisce il flusso di file attuale.
sprintf() Restituisce una stringa formattata.
tell() Restituisce la posizione del puntatore interno di un flusso di file.

Tabella 7.5. Elenco di alcune funzioni riferite alle operazioni di I/O.

7.3.1   binmode()

binmode  flusso

binmode() attiva la modalità binaria per il file corrispondente al flusso di file indicato come argomento. Generalmente, non è necessario utilizzare questa istruzione con GNU/Linux, mentre potrebbe essere necessario in altri ambienti. Si può dire che questa istruzione serva solo quando il sistema operativo sottostante utilizza un codice di interruzione di riga diverso dal semplice <LF>.

7.3.2   chomp()

chomp  espressione_stringa
chomp  lista

chomp() riceve come argomento un'espressione che restituisce una stringa o una lista di stringhe. Il suo scopo è eliminare dalla parte finale il codice di interruzione di riga, che coincide normalmente con il carattere <LF>. Precisamente si tratta di quanto contenuto nella variabile predefinita $/. Se non viene indicato l'argomento, interviene sul contenuto della variabile $_. Restituisce il numero di caratteri eliminati.

Esempi
#!/usr/bin/perl
$/ = "\r\n";
while ($riga = <STDIN>)
  {
    chomp ($riga);
    print STDOUT ("$riga\n");
  }

Quello che si vede è un esempio molto semplice di un filtro che trasforma un file di testo in stile Dos a uno in stile Unix. In pratica, viene definito che l'interruzione di riga è indicata attraverso la sequenza dei caratteri <CR><LF> (\r\n), e quindi, attraverso la funzione chomp() viene eliminata dalle righe lette. Infine, le righe vengono emesse attraverso lo standard output, con l'aggiunta del codice <LF> finale.

7.3.3   chop()

chop  espressione_stringa
chop  lista

chop() riceve come argomento un'espressione che restituisce una stringa o una lista di stringhe. Il suo scopo è eliminare l'ultimo carattere della stringa, o delle stringhe della lista. In questo senso differisce da chomp() che invece elimina la parte finale solo se necessario. Restituisce l'ultimo carattere eliminato.

7.3.4   close()

close  flusso

close() chiude un flusso di file aperto precedentemente. Restituisce Vero se l'operazione ha successo e non si sono prodotti errori di alcun tipo. È opportuno osservare che non è necessario chiudere un file se poi si deve riaprire immediatamente con la funzione open(): lo si può semplicemente riaprire.

Esempi
close (MIO_FILE);

Chiude il flusso di file MIO_FILE.

7.3.5   eof()

eof  flusso

eof() verifica se la prossima lettura del flusso di file supera la fine del file. Restituisce uno se ciò si verifica. Questa funzione è generalmente di scarsa utilità dal momento che la lettura di una riga oltre la fine del file genera un risultato indefinito che può essere verificato tranquillamente in un'espressione condizionale. Oltre a ciò, eof() si verifica prima che il tentativo di lettura sia stato fatto veramente, contrariamente a quanto avviene di solito in altri linguaggi di programmazione.

7.3.6   fcntl()

fcntl  flusso , funzione , scalare

fcntl() esegue la chiamata di sistema omonima, e per questo può essere utilizzata solo con un sistema operativo che la gestisce. Prima di poter utilizzare questa funzione occorre richiamare una serie di valori corrispondenti a macro del proprio sistema:

use Fcntl;

7.3.7   fileno()

fileno  flusso

fileno() restituisce il descrittore corrispondente a un flusso di file.

7.3.8   flock()

flock  flusso , operazione

flock() esegue la chiamata di sistema omonima, oppure una sua emulazione, per il file identificato tramite il flusso di file. flock() permette di eseguire il blocco di un file nel suo complesso e non record per record. Restituisce Vero se l'operazione ha successo.

L'operazione, cioè il tipo di blocco, viene indicata attraverso una sorta di macro che viene inserita nel sorgente di Perl attraverso la dichiarazione seguente:

use Fcntl ':flock';
Operazioni
LOCK_SH

Corrisponde normalmente al valore numerico uno. Richiede un blocco condiviso (shared).

LOCK_EX

Corrisponde normalmente al valore numerico due. Richiede un blocco esclusivo.

LOCK_UN

Corrisponde normalmente al valore numerico otto. Rilascia il blocco.

LOCK_NB

Corrisponde normalmente al valore numerico quattro. Viene sommato a LOCK_SH o a LOCK_EX in modo da non attendere lo sblocco del file nel caso che questo risulti già bloccato.

Esempi
use Fcntl ':flock';   # importa le costanti LOCK_...
...
open (ELENCO, ">> /home/tizio/mioelenco");
flock (ELENCO, LOCK_EX);
seek (ELENCO, 0, 2);
print ELENCO $daelencare,"\n";
flock (ELENCO, LOCK_UN);

Vengono eseguite le operazioni seguenti:

  • si caricano le costanti di definizione dei tipi di blocco attraverso l'istruzione use Fcntl ':flock';;

  • si apre il file /home/tizio/mioelenco in aggiunta;

  • si blocca il file in modo esclusivo;

  • per sicurezza si posiziona il puntatore del file alla fine dello stesso;

  • si inserisce una riga nel file;

  • si rilascia il blocco.

use Fcntl ':flock';   # importa le costanti LOCK_...
...
open (ELENCO, ">> /home/tizio/mioelenco");
if (flock (ELENCO, (LOCK_EX)+(LOCK_NB)))
  {
    seek (ELENCO, 0, 2);
    print ELENCO $daelencare,"\n";
    flock (ELENCO, LOCK_UN);
  }
else
  {
    print STDOUT "Il file è impegnato.\n";
  }

Si tratta di una variante dell'esempio precedente in cui si richiede un blocco esclusivo senza attesa. Se il blocco ha successo, si procede, altrimenti viene segnalata la presenza del blocco eseguito da un altro processo (si osservi il fatto che le macro sono state racchiuse tra parentesi tonde prima di sommarle assieme).

7.3.9   getc()

getc  flusso

getc() legge il file indicato dal flusso di file, o dallo standard input se viene omesso l'argomento, e restituisce il prossimo carattere. Se si supera la fine del file restituisce la stringa nulla.

7.3.10   ioctl()

ioctl  flusso , funzione , scalare

ioctl() esegue la chiamata di sistema omonima, e per questo può essere utilizzata solo con un sistema operativo che la gestisce. Per poterla utilizzare occorre consultare la documentazione interna di Perl.

7.3.11   open()

open  flusso , file

open() apre il file indicato come secondo argomento utilizzando il flusso di file indicato come primo argomento. Il nome del file è composto normalmente da un prefisso simbolico che ne rappresenta la modalità di utilizzo:

Il prefisso può essere staccato dal nome del file attraverso spazi. L'apertura del file rappresentato da un trattino (-) è equivalente all'apertura dello standard input, mentre l'apertura del file >- è equivalente all'apertura dello standard output.

Restituisce Vero se l'apertura ha successo.

Esempi
if (open (ORDINI, ">> /var/log/ordini"))
  {
    if (flock (ORDINI, LOCK_EX))
      {
        seek (ORDINI, 0, 2);
        print ORDINI ("$ordine\n");
      }
    close (ORDINI);
  }

Tenta di aprire il file /var/log/ordini in aggiunta, quindi tenta di bloccarlo in modo esclusivo. Se ci riesce sposta il puntatore alla fine del file, per sicurezza, quindi inserisce un nuovo ordine. Infine chiude il file.

if (open (MAN, "man $DATI{sezione} $DATI{man} | col -bx |"))
  {
    print "Content-type: text/html\n";
    print "\n";
    print "<HTML>\n";
    print "<HEAD>\n";
    print "<TITLE>man $DATI{sezione} $DATI{man}</TITLE>\n";
    print "</HEAD>\n";
    print "<BODY>\n";
    print "<H1>man $DATI{sezione} $DATI{man}</H1>\n";
    print "<PRE>\n";

    while ($risposta = <MAN>)
      {
        print $risposta;
      }

    print "</PRE>\n";
    print "</BODY>\n";
    print "</HTML>\n";
}

Genera una pagina HTML a partire da un comando man.

7.3.12   pipe()

pipe  flusso_in_lettura , flusso_in_scrittura

pipe() esegue la chiamata di sistema omonima, aprendo due flussi di file, uno in lettura e l'altro in scrittura. Per poterla utilizzare occorre consultare la documentazione interna di Perl.

7.3.13   print()

print  flusso   lista
print  lista

print() emette attraverso il flusso di file indicato la lista di argomenti successiva. Se non viene specificato un flusso di file, tutto viene emesso attraverso lo standard output, oppure attraverso quanto specificato con la funzione select(). Se non viene specificato alcun argomento, viene emesso il contenuto della variabile $_.

È il caso di osservare che l'argomento che specifica il flusso è separato dalla lista di stringhe da emettere solo attraverso uno o più spazi, e non da una virgola. Per lo stesso motivo, se il flusso di file è contenuto in un elemento di un array, oppure è il risultato di un'espressione, ciò deve essere indicato in un blocco.

Restituisce Vero se l'operazione di scrittura ha successo.

Esempi
print "Ciao, come stai?\n";

Emette attraverso lo standard output il messaggio indicato come argomento.

print STDERR "Errore $errore\n";

Emette attraverso lo standard error il messaggio indicato come argomento.

print { $elenco_file[$i] } "Bla bla bla\n";

Inserisce il messaggio nel flusso di file indicato da $elenco_file[$i].

print { $ok ? STDOUT : STDERR } ("Bla bla bla\n");

Emette il messaggio attraverso lo standard output, oppure lo standard error, a seconda del valore contenuto in $ok.

7.3.14   printf()

printf  flusso   formato , lista
printf  formato , lista

È equivalente all'uso di sprintf() nel modo seguente:

print  flusso  sprintf  formato , lista

7.3.15   read()

read  flusso , scalare , lunghezza , scostamento
read  flusso , scalare , lunghezza

read() tenta di leggere il flusso di file specificato e di ottenere la quantità di byte espressa nel terzo argomento, inserendo quanto letto nella variabile scalare indicata come secondo. Se viene indicato anche il quarto argomento, lo scostamento, il contenuto della variabile non viene rimpiazzato completamente, ma è sovrascritto a partire dalla posizione indicata dallo scostamento stesso. La funzione restituisce il numero di byte letti effettivamente, oppure il valore indefinito se si è verificato un errore.

7.3.16   seek()

seek  flusso , posizione , partenza

seek() modifica la posizione del puntatore riferito al flusso di file. La posizione effettiva nel file dipende dal valore del secondo e del terzo argomento. Precisamente, il terzo argomento può essere zero, uno o due, in base al significato seguente:

Esempi
seek (MIO_FILE, 0, 2);

Posiziona alla fine del file in modo da poter aggiungere successivamente qualcosa a questo.

seek (MIO_FILE, 0, 0);

Posiziona all'inizio del file.

7.3.17   select()

select  flusso

select() permette di definire il flusso di file in scrittura predefinito, per tutte quelle situazioni in cui questo concetto ha significato.

Esempi
select (MIO_FILE);
...
print ("ciao a tutti\n");

Aggiunge al file identificato dal flusso di file MIO_FILE il messaggio ciao a tutti.

7.3.18   sprintf()

sprintf  formato , lista

sprintf() restituisce una stringa formattata in modo analogo a quanto fa la funzione omonima del linguaggio C. Il primo argomento è la stringa da formattare, quelli successivi sono i valori da inserire. Perl utilizza una propria gestione della conversione secondo quanto riportato nelle tabelle 7.6 e 7.7.

Simbolo Corrispondenza
%% Segno di percentuale.
%c Un carattere con il numero dato.
%s Una stringa.
%d Un intero con segno a base 10.
%u Un intero senza segno a base 10.
%o Un intero senza segno in ottale.
%x Un intero senza segno in esadecimale.
%e Un numero a virgola mobile, in notazione scientifica.
%f Un numero a virgola mobile, in notazione decimale fissa.
%g Un numero a virgola mobile, secondo la notazione di %e o %f.
%X Come %x, ma con l'uso di lettere maiuscole.
%E Come %e, ma con l'uso della lettera E maiuscola.
%G Come %g, ma con l'uso della lettera E maiuscola (se applicabile).
%p Un puntatore (l'indirizzo utilizzato da Perl in esadecimale).
%n Immagazzina, nella prossima variabile, il numero di caratteri già emessi.
%i Sinonimo di %d.
%D Sinonimo di %ld.
%U Sinonimo di %lu.
%O Sinonimo di %lo.
%F Sinonimo di %f.

Tabella 7.6. Elenco dei simboli utilizzabili in una stringa formattata per l'utilizzo con sprintf().

Simbolo Corrispondenza
spazio Il prefisso di un numero positivo è uno spazio.
+ Il prefisso di un numero positivo è il segno +.
- Allinea a sinistra rispetto al campo.
0 Utilizza zeri, invece di spazi, per allineare a destra.
# Prefissa un numero ottale con uno zero e un numero esadecimale con 0x...
nUn numero definisce la dimensione minima del campo.
. nPer i numeri a virgola mobile esprime la precisione, ovvero il numero di decimali.
. nPer le stringhe definisce la lunghezza massima.
. nPer gli interi definisce la lunghezza minima.
l Interpreta un intero come il tipo C long o unsigned long.
h Interpreta un intero come il tipo C short o unsigned short.
V Interpreta un intero secondo il tipo standard di Perl.

Tabella 7.7. Elenco dei simboli utilizzabili tra il segno di percentuale e la lettera di conversione.

Quando il simbolo è formato da un numero, al posto di tale numero può essere utilizzato l'asterisco (*) intendendo in questo modo di utilizzare il valore inserito nell'elemento successivo.

sprintf() è sensibile all'attivazione della localizzazione, nel qual caso, il carattere utilizzato per separare le cifre intere da quelle decimali, dipende dalla variabile di ambiente LC_NUMERIC.

7.3.19   tell()

tell  flusso

tell() restituisce la posizione corrente del puntatore interno riferito al flusso di file indicato come argomento, oppure a quello dell'ultima operazione di lettura eseguita.

7.4   Interazione con il sistema

Nel gruppo di sezioni seguenti vengono descritte alcune funzioni per l'interazione con il sistema.

Nome Descrizione.
exec() Esegue il comando senza ritornare.
kill() Invia un segnale ai processi.
sleep() Pausa.
system() Esegue il comando e attende la sua conclusione.
time() Restituisce la data e l'ora del sistema espressa in secondi.
times() Restituisce la data e l'ora del sistema in modo dettagliato.
umask() Definisce la maschera dei permessi.

Tabella 7.8. Elenco di alcune funzioni riferite all'interazione con il sistema.

7.4.1   exec()

exec  elenco

exec() avvia l'esecuzione del comando indicato negli argomenti, senza riprendere l'esecuzione del programma al termine. Si comporta quindi in modo analogo al comando interno omonimo delle shell comuni.

Esempi
...
exec ("ls");
...

Esegue il comando ls e conclude il funzionamento del programma. In pratica, le istruzioni successive a exec(), non vengono eseguite.

7.4.2   kill()

kill  segnale , elenco_di_processi

kill() invia un segnale a una serie di processi. Il primo argomento deve essere il segnale. Restituisce il numero di processi che hanno ricevuto il segnale.

Esempi
kill ("TERM", 588);

Invia il segnale SIGTERM al processo numero 588.

kill (15, 588);

Esattamente come nell'esempio precedente.

kill (-15, 588);

Come nell'esempio precedente, ma il segnale viene inviato anche a tutti i processi discendenti da quello indicato.

7.4.3   sleep()

sleep  secondi

sleep() mette in pausa l'esecuzione del programma, per il numero di secondi indicato come argomento, eventualmente attraverso un'espressione. Se l'argomento non viene indicato, la pausa non ha fine. L'attesa può essere interrotta inviando un segnale SIGALRM al processo. Restituisce il numero di secondi trascorsi effettivamente.

Esempi
sleep;

Mette il programma in pausa senza specificare la fine di questa.

sleep (10);

Mette il programma in pausa per 10 secondi.

sleep ($pausa);

Mette il programma in pausa per la quantità di secondi indicata dalla variabile $pausa.

7.4.4   system()

system  elenco

system() avvia l'esecuzione del comando indicato negli argomenti, attende la sua conclusione e restituisce il valore generato dal comando stesso.

Esempi
system ("ls");

Esegue il comando ls e poi riprende con il programma.

if (system ("mkdir ciao")
  {
    die("La creazione della directory è fallita\n");
  }
else
  {
    print ("La directory è stata creata\n");
  }

L'esempio mostra il caso in cui si voglia controllare l'esito di un comando di sistema avviato attraverso la funzione system(). Se il comando mkdir ciao viene eseguito con successo, restituisce il valore zero, che per Perl equivale a Falso. Quindi, se la condizione si avvera, significa che l'operazione è fallita, altrimenti, tutto è andato bene.

7.4.5   time()

time

time() restituisce la data e l'ora attuale espressa in secondi trascorsi dalla data iniziale gestita dal sistema. Nel caso della maggior parte dei sistemi Unix si tratta dell'ora zero del 1/1/1970. Il valore ottenuto da time() può essere utilizzato dalle funzioni gmtime() e localtime()

7.4.6   times()

times

times() restituisce un array di quattro elementi che indicano rispettivamente:

  1. orario dell'utente;

  2. orario di sistema;

  3. orario dell'utente del processo figlio;

  4. orario di sistema del processo figlio.

Esempi
($user, $system, $cuser, $csystem) = times;

Scompone l'array restituito da times() in quattro variabili scalari.

7.4.7   umask()

umask  maschera_numerica

umask() permette di definire la maschera dei permessi per il processo elaborativo del programma. Restituisce il valore precedente.

La maschera è espressa in forma numerica; ciò significa che se la maschera da indicare come argomento è una stringa, potrebbe essere necessario l'utilizzo della funzione oct() per garantire l'interpretazione ottale e non a base 10.

Esempi
$maschera = '644';
umask (oct ($maschera));

Modifica la maschera dei permessi in modo che sia pari a 06448. Dal momento che l'informazione è contenuta in una stringa, che per di più non ha lo zero iniziale della rappresentazione ottale convenzionale, occorre convertire prima la stringa in numero nel modo corretto.

7.5   Funzioni matematiche

Perl fornisce una serie di funzioni matematiche tipiche della maggior parte dei linguaggi di programmazione.

Nome Descrizione.
abs() Calcola il valore assoluto.
atan2() Calcola l'arcotangente dell'intervallo da -PI a +PI.
cos() Calcola il coseno.
exp() Calcola l'esponente.
int() Estrae la parte intera.
log() Calcola il logaritmo naturale.
sin() Calcola il seno.
sqrt() Calcola la radice quadrata.

Tabella 7.9. Elenco di alcune funzioni matematiche.

7.5.1   abs()

abs  x

abs() restituisce il valore assoluto del suo argomento. Se l'argomento non viene indicato, si utilizza la variabile predefinita $_.

7.5.2   atan2()

atan2  x , y

atan2() restituisce l'arcotangente nell'intervallo da -PI a +PI.

7.5.3   cos()

cos  x

cos() restituisce il coseno. Se l'argomento non viene indicato, si utilizza la variabile predefinita $_.

7.5.4   exp()

exp  x

exp() restituisce  e  (la base del logaritmo naturale) elevato al valore di  x , cioè dell'argomento. Se l'argomento non viene indicato, si utilizza la variabile predefinita $_.

7.5.5   int()

int  x

int() restituisce la parte intera del numero (o dell'espressione) fornito come argomento. Se l'argomento non viene indicato, si utilizza la variabile predefinita $_.

7.5.6   log()

log  x

log() restituisce il logaritmo naturale del valore fornito come argomento. Se l'argomento non viene indicato, si utilizza la variabile predefinita $_.

7.5.7   sin()

sin  x

sin() restituisce il seno. Se l'argomento non viene indicato, si utilizza la variabile predefinita $_.

7.5.8   sqrt()

sqrt  x

sqrt() restituisce la radice quadrata. Se l'argomento non viene indicato, si utilizza la variabile predefinita $_.

7.6   Funzioni di conversione

Nelle sezioni seguenti sono elencate le funzioni che si occupano di convertire dati in formati differenti.

Nome Descrizione.
chr() Converte un numero nel carattere corrispondente.
hex() Converte una stringa esadecimale nel numero corrispondente.
oct() Converte una stringa ottale nel numero corrispondente.
ord() Converte un carattere nel numero corrispondente.

Tabella 7.10. Elenco di alcune funzioni di conversione.

7.6.1   chr()

chr  n

chr() restituisce il carattere corrispondente al numero indicato come argomento. Se non viene specificato l'argomento, il numero viene letto dalla variabile $_.

Esempi
chr (65);

Restituisce la lettera A maiuscola.

7.6.2   hex()

hex  stringa

hex() interpreta il proprio argomento come una stringa contenente un numero esadecimale. Restituisce il numero (decimale) corrispondente. Se non viene specificato l'argomento, il dato viene letto dalla variabile $_.

Esempi
hex ("0xAf");

Restituisce il numero 175.

hex ("af");

Restituisce il numero 175.

7.6.3   oct()

oct  stringa

oct() interpreta il proprio argomento come una stringa contenente un numero ottale. Restituisce il numero (decimale) corrispondente. Se non viene specificato l'argomento, il dato viene letto dalla variabile $_.

Esempi
$permessi = '0755';
mkdir ("/tmp/prova", oct ($permessi));

Crea la directory /tmp/prova/ con i permessi 07558. Dal momento che questi permessi sono contenuti in una variabile, in forma di stringa, devono essere convertiti in ottale prima dell'uso, altrimenti verrebbero interpretati in forma decimale.

7.6.4   ord()

ord  stringa

ord() restituisce il valore numerico corrispondente al codice ASCII del primo carattere della stringa fornita come argomento. Se non viene specificato l'argomento, il dato viene letto dalla variabile $_.

7.7   Gestione delle espressioni

Sono elencate nelle sezioni seguenti le funzioni che si occupano di gestire l'esecuzione delle espressioni (quando necessario) e di conoscerne alcune caratteristiche.

7.7.1   defined()

defined  espressione

defined() restituisce Vero se l'espressione (o la variabile) restituisce un valore diverso da indefinito. Il valore indefinito può essere restituito in particolare nelle seguenti situazioni:

È importante non confondere il valore indefinito con lo zero o la stringa vuota: si tratta di tre cose differenti, in particolare, zero e stringa vuota sono valori definiti.

7.7.2   scalar()

scalar  espressione

scalar() restituisce il risultato dell'espressione valutato in un contesto espressamente scalare.

7.8   Array e hash

Nelle sezioni seguenti sono elencate le funzioni che sono particolarmente dedicate alla gestione di array e hash.

Nome Descrizione.
delete() Elimina elementi da un hash.
exists() Verifica la presenza di una chiave all'interno di un hash.
keys() Restituisce un array con le chiavi di un hash.
pop() Estrae l'ultimo elemento di un array.
push() Aggiunge un elemento in coda a un array.
splice() Elimina o inserisce degli elementi in un array, in posizioni arbitrarie.

Tabella 7.11. Elenco di alcune funzioni utili nella gestione degli array.

7.8.1   delete()

delete  espressione

delete() elimina uno o più elementi da un hash. L'espressione che rappresenta l'argomento della funzione deve rappresentare uno o più elementi dell'hash. Restituisce i valori cancellati, cioè quelli abbinati alle chiavi indicate per la cancellazione.

Esempi
delete $miohash{ $miachiave };

Elimina dall'hash %miohash l'elemento rappresentato dalla chiave contenuta nella variabile $miachiave.

7.8.2   exists()

exists  espressione

exists() verifica l'esistenza di una chiave all'interno di un hash. Se esiste, anche se il valore corrispondente dovesse risultare indefinito, restituisce Vero. L'espressione che rappresenta l'argomento della funzione deve rappresentare un solo elemento dell'hash.

Esempi
if (exists $miohash{ $miachiave })
  {
    ...
  }

Verifica l'esistenza dell'elemento rappresentato dalla chiave contenuta nella variabile $miachiave, all'interno dell'hash %miohash. In caso affermativo esegue alcune istruzioni.

7.8.3   keys()

keys  hash

keys() restituisce un array composto da tutte le chiavi dell'hash posto come argomento.

7.8.4   pop()

pop  array

pop() restituisce l'ultimo elemento dell'array eliminandolo dall'array stesso (accorciandolo). In pratica tratta l'array come una pila (stack) ed esegue un'azione di pop.

7.8.5   push()

push  array , lista

push() aggiunge all'array indicato come primo argomento gli elementi della lista successiva. In pratica tratta l'array come una pila (stack) ed esegue un'azione di push.

7.8.6   splice()

splice  array , posizione_iniziale , lunghezza , lista
splice  array , posizione_iniziale , lunghezza
splice  array , posizione_iniziale

splice() elimina dall'array, indicato come primo argomento, gli elementi collocati a partire dalla posizione iniziale, indicata come secondo argomento, per una quantità definita dal terzo argomento. Se il terzo argomento (la quantità di elementi da eliminare) viene omesso, vengono eliminati tutti gli elementi a partire dalla posizione iniziale.

Se dopo il numero di argomenti da eliminare appaiono altri argomenti, vengono interpretati come una lista da inserire in sostituzione degli elementi cancellati. In tal modo, attraverso questa funzione, si può accorciare e allungare un array a piacimento, intervenendo in qualunque punto dello stesso.

7.9   Controllo dell'esecuzione del programma

Nelle sezioni seguenti sono elencate le funzioni che sono utili per controllare l'esecuzione di un programma Perl. In particolare ciò che permette di gestire le situazioni di errore.

Nome Descrizione.
die() Emette un messaggio e termina l'esecuzione del programma.
do() Esegue un sottoprogramma.
eval() Controlla un gruppo di istruzioni.
exit() Termina l'esecuzione del programma restituendo un valore.
require() Richiede qualcosa per proseguire con il programma.
warn() Emette un messaggio di avvertimento attraverso lo standard error.

Tabella 7.12. Elenco di alcune funzioni per il controllo dell'esecuzione del programma.

7.9.1   die()

die  lista

die() emette il contenuto degli elementi della lista fornita come argomento attraverso lo standard error e quindi termina l'esecuzione del programma.

Il programma Perl terminato in questo modo restituisce generalmente il valore contenuto dalla variabile $!.

Esempi
if (chdir '/var/spool/lpd')
  {
        ...
  }
else
  {
    die "L'operazione non è consentita.\n";
  }

Se lo spostamento nella directory /var/spool/lpd/ fallisce, visualizza il messaggio attraverso lo standard error e termina.

7.9.2   do()

do  file

do() permette di includere il file indicato come argomento. In generale viene usato per inserire delle subroutine esterne.

Esempi
do 'prova.pl';

Esegue il contenuto del file prova.pl.

7.9.3   eval()

eval  blocco
eval  espressione

eval() permette di controllare l'esecuzione di un blocco di istruzioni, in modo da limitare i danni in caso di interruzione. In pratica, se all'interno del blocco si manifesta un errore di sintassi o di esecuzione, o ancora se viene incontrata un'istruzione die(), eval() restituisce un valore indefinito e l'esecuzione del programma continua.

Se si manifesta un errore, questo viene riportato dalla variabile $@.

Nel caso non si verifichino errori, eval() restituisce il valore dell'ultima espressione del blocco di istruzioni controllato.

7.9.4   exit()

exit  espressione

exit() valuta l'espressione posta come argomento e termina l'esecuzione del programma restituendo all'esterno quel valore.

È importante ricordare che dal punto di vista dei programmi, la restituzione del valore zero corrisponde a una conclusione con successo, mentre un valore pari a uno o superiore, rappresenta una conclusione anomala.

Esempi
if (chdir '/var/spool/lpd')
  {
    ...
  }
else
  {
    print "L'operazione non è consentita.\n";
    exit 1;
  }

Se lo spostamento nella directory /var/spool/lpd/ fallisce, visualizza il messaggio e termina restituendo il valore uno.

7.9.5   require()

require  espressione
require  file

require() permette di specificare nel programma l'esigenza di qualcosa. Se si tratta di un'espressione il cui risultato è numerico, si vuole indicare che il programma richiede un interprete perl di versione maggiore o uguale a quel numero. Se si tratta di una stringa si intende che il programma richiede l'inclusione del file corrispondente come libreria.

L'inclusione del file si ottiene solo se ciò non è già avvenuto.

7.9.6   warn()

warn  lista

warn() emette il contenuto degli elementi della lista fornita come argomento attraverso lo standard error. Solitamente, warn() viene utilizzato come die() nelle situazioni in cui non è necessario interrompere l'esecuzione del programma.

7.10   Riferimenti

Informatica per il commercio elettronico 2000.11.04 --- Copyright © 2000 Daniele Giacomini --  daniele @ swlibero.org

1) Anche se la documentazione fa esplicito riferimento a questa possibilità, può darsi che non sia possibile evitare di indicare i permessi. Nello stesso modo, anche se si indicano i permessi non è garantito che questi vengano rispettati fedelmente dal sistema operativo sottostante, come descritto nell'esempio successivo.


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome perl_funzioni_interne.html

[successivo] [precedente] [inizio] [fine] [indice generale] [indice analitico]