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


168. 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; per la precisione:

168.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.
-x Test 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 168.1: Elenco di alcune funzioni riferite alle operazioni sui file.

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

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

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

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

168.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 `$_'.

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

168.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 filesystem di partenza. Restituisce uno se l'operazione riesce, altrimenti zero.

168.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 168.3 in cui appare anche il nome suggerito per la trasformazione in variabili scalari.

Elemento Nome consueto Descrizione.
0 $dev Numero del dispositivo del filesystem.
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 168.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 filesystem 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.

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

168.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 `$_'.

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

168.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 168.4: Elenco di alcune funzioni riferite alle operazioni sulle directory.

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

168.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/*'.

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

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

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

168.2.4 rmdir()

rmdir <directory>

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

168.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 168.5: Elenco di alcune funzioni riferite alle operazioni di I/O.

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

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

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

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

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

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

168.3.7 fileno()

fileno <flusso>

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

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

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

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

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

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

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

168.3.14 printf()

printf <flusso> <formato>,<lista>

printf <formato>,<lista>

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

print <flusso> sprintf <formato>,<lista>

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

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

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

168.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 168.6 e 168.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 168.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...
n Un numero definisce la dimensione minima del campo.
.n Per i numeri a virgola mobile esprime la precisione, ovvero il numero di decimali.
.n Per le stringhe definisce la lunghezza massima.
.n Per 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 168.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'.

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

168.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 168.8: Elenco di alcune funzioni riferite all'interazione con il sistema.

168.4.1 exec()

exec <elenco>

`exec()' avvia l'esecuzione del comando indicato negli argomenti, senza ritornare. 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.

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

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

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

168.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()'

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

168.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, e questo 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 0644. 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.

168.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 168.9: Elenco di alcune funzioni matematiche.

168.5.1 abs()

abs x

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

168.5.2 atan2()

atan2 x,y

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

168.5.3 cos()

cos x

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

168.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 `$_'.

168.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 `$_'.

168.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 `$_'.

168.5.7 sin()

sin x

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

168.5.8 sqrt()

sqrt x

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

168.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 168.10: Elenco di alcune funzioni di conversione.

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

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

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

168.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 `$_'.

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

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

168.7.2 scalar()

scalar <espressione>

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

168.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 168.11: Elenco di alcune funzioni utili nella gestione degli array.

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

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

168.8.3 keys()

keys <hash>

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

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

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

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

168.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 168.12: Elenco di alcune funzioni per il controllo dell'esecuzione del programma.

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

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

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

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

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

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

168.10 Riferimenti

---------------------------

Appunti Linux 2000.04.12 --- Copyright © 1997-2000 Daniele Giacomini --  daniele @ pluto.linux.it


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