[successivo] [precedente] [inizio] [fine] [indice generale] [violazione licenza] [translators] [docinfo] [indice analitico] [volume] [parte]
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:
|
|
lista equivale a:
|
|
Le funzioni descritte sono raggruppate in base al tipo di situazione in cui vengono utilizzate normalmente.
Vengono qui descritte alcune funzioni che riguardano la gestione dei file, nel senso globale, esterno. Le funzioni per la gestione del contenuto dei file vengono mostrate più avanti.
Tabella 361.1. Funzioni Perl per la gestione esterna dei file.
| Funzione | Descrizione |
|
| Perl permette di effettuare una serie di test sui file in modo analogo a quanto si fa con le shell tradizionali. 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. I vari test restituiscono il valore uno se si verificano, oppure la stringa nulla in caso contrario (salvo eccezioni, come mostrato successivamente). Le descrizioni successive mostrano i vari tipi di test. |
|
| Il file è accessibile in lettura dal numero UID/GID efficace. |
|
| Il file è accessibile in scrittura dal numero UID/GID efficace. |
|
| Il file è accessibile in esecuzione dal numero UID/GID efficace. |
|
| Il file appartiene al numero UID efficace. |
|
| Il file è accessibile in lettura dal numero UID/GID reale. |
|
| Il file è accessibile in scrittura dal numero UID/GID reale. |
|
| Il file è accessibile in esecuzione dal numero UID/GID reale. |
|
| Il file appartiene al numero UID reale. |
|
| Il file esiste. |
|
| Il file ha dimensione zero. |
|
| Il file ha una dimensione maggiore di zero (restituisce la dimensione). |
|
| Si tratta di un file normale. |
|
| Si tratta di una directory. |
|
| Si tratta di un collegamento simbolico. |
|
| Si tratta di una pipe con nome. |
|
| Si tratta di un socket. |
|
| Si tratta di file di dispositivo a blocchi. |
|
| Si tratta di file di dispositivo a caratteri. |
|
| Si tratta di un flusso di file aperto su un terminale. |
|
| Il file ha il bit SUID attivo. |
|
| Il file ha il bit SGID attivo. |
|
| Il file ha il bit Sticky attivo. |
|
| Si tratta di un file di testo. |
|
| Si tratta di un file binario. |
|
| Restituisce quanto tempo ha il file in base alla data di modifica. |
|
| Restituisce quanto tempo ha il file in base alla data di accesso. |
|
| Restituisce quanto tempo ha il file in base alla data di creazione. |
|
| 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. |
|
| 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. |
|
| link() genera un collegamento fisico a partire da un file esistente. Restituisce Vero se la creazione ha successo. |
|
| 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 $_. |
|
| readlink() restituisce il valore di un collegamento simbolico. Se non viene indicato l'argomento, readlink() utilizza il contenuto della variabile predefinita $_. |
|
| 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. |
|
| 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 361.2 in cui appare anche il nome suggerito per la trasformazione in variabili scalari. 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. |
|
| symlink() genera un collegamento simbolico a partire da un file esistente. Restituisce Vero se la creazione ha successo. |
|
| 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 $_. |
|
| 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. |
Tabella 361.2. Elenco degli elementi componenti l'array restituito da stat().
Segue la descrizione di alcuni esempi.
|
Restituisce il messaggio se il file esempio.pl è eseguibile.
|
Cambia i permessi ai file indicati dopo la modalità.
|
Esattamente come nell'esempio precedente.
|
Esattamente come nell'esempio precedente, ma più simile alle chiamate di funzione degli altri linguaggi.
|
Cambia l'utente e il gruppo proprietari dei file mio_file, tuo_file e suo_file.
|
Esattamente come nell'esempio precedente.
|
Assegna alla variabile $prova il percorso contenuto nel collegamento simbolico /bin/sh. Probabilmente, alla fine, la variabile contiene la stringa bash.
|
Preleva tutte le informazioni sul file /home/tizio/mio_file e le scompone in diverse variabili scalari.
|
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.
Vengono qui 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.
Tabella 361.3. Funzioni Perl per la gestione delle directory e dei raggruppamenti di file.
Segue la descrizione di alcuni esempi.
|
Assegna alla variabile $primo il percorso assoluto del primo file che viene trovato attraverso l'espansione del modello /bin/*.
|
Assegna all'array @elenco i percorsi assoluti dei file che vengono trovati attraverso l'espansione del modello /bin/*.
|
Crea la directory /tmp/prova/ con i permessi normali dell'utente.(1)
|
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.
Vengono elencate alcune funzioni che riguardano la gestione dei dati contenuti nei file.
Tabella 361.4. Funzioni Perl per la gestione del contenuto dei file.
| Funzione | Descrizione |
|
| binmode() consente di dichiarare la codifica utilizzata per il file corrispondente al flusso di file indicato come primo argomento. Si usa normalmente quando si vuole dichiarare la codifica dei flussi standard, che risultano già aperti senza alcuna dichiarazione esplicita. |
|
| 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. |
|
| 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. |
|
| 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. |
|
| 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. |
|
| 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; |
|
| fileno() restituisce il descrittore corrispondente a un flusso di file. |
|
| 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'; |
|
| 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. |
|
| getc() legge il file indicato dal flusso di file, o dallo standard input se viene omesso l'argomento, restituendo il prossimo carattere. Se si supera la fine del file restituisce la stringa nulla. |
|
| 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. |
|
| open() apre il file indicato come ultimo argomento utilizzando il flusso di file indicato come primo argomento. Se manca l'argomento centrale, 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. |
|
| Questo simbolo o l'assenza di ogni altro prefisso rappresenta l'apertura del file in lettura, o in input. |
|
| Il file viene troncato (viene ridotto a un file vuoto) e aperto in scrittura, o in output. |
|
| Il file viene aperto in scrittura in aggiunta. |
|
| Il file viene aperto in lettura e scrittura, senza il troncamento iniziale. |
|
| Il file viene aperto in scrittura e lettura, a cominciare dal troncamento iniziale. |
|
| Il file viene aperto in aggiunta e in lettura. |
|
| Il file viene interpretato come un comando a cui inviare i dati in scrittura attraverso una pipeline. |
|
| Il file viene interpretato come un comando da cui leggere i dati emessi dal suo standard output. |
|
| Il file viene interpretato come un comando a cui inviare i dati in scrittura e attraverso il suo standard input, leggendo quanto emesso attraverso lo standard output. |
|
| 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. |
|
| 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 (non si usa la 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. |
|
| È equivalente all'uso di sprintf() nel modo seguente: print flusso sprintf formato,lista |
|
| 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. |
|
| 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, come descritto nelle voci successive. |
|
| Sposta il puntatore esattamente a quanto indicato dal secondo argomento. |
|
| Sposta il puntatore alla posizione corrente, più quanto indicato dal secondo argomento. |
|
| Sposta il puntatore alla fine del file, più quanto indicato dal secondo argomento, che solitamente è un valore negativo. |
|
| select() permette di definire il flusso di file in scrittura predefinito, per tutte quelle situazioni in cui questo concetto ha significato. |
|
| 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 361.5 e 361.6. 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. |
|
| 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. |
|
| use open consente di dichiarare la codifica una volta per tutte, fino a quando si incontra un'altra istruzione del genere. |
Tabella 361.5. Elenco dei simboli utilizzabili in una stringa formattata per l'utilizzo con sprintf().
Tabella 361.6. Elenco dei simboli utilizzabili tra il segno di percentuale e la lettera di conversione.
Segue la descrizione di alcuni esempi.
|
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), che 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.
|
|
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.
|
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).
|
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.
|
|
Emette attraverso lo standard output il messaggio indicato come argomento.
|
Emette attraverso lo standard error il messaggio indicato come argomento.
|
Inserisce il messaggio nel flusso di file indicato da $elenco_file[$i].
|
Emette il messaggio attraverso lo standard output, oppure lo standard error, a seconda del valore contenuto in $ok.
|
Posiziona alla fine del file in modo da poter aggiungere successivamente qualcosa a questo.
|
Posiziona all'inizio del file.
|
Aggiunge al file identificato dal flusso di file MIO_FILE il messaggio ciao a tutti.
Vengono descritte alcune funzioni per l'interazione con il sistema.
Tabella 361.7. Funzioni Perl per l'interazione con il sistema operativo.
Segue la descrizione di alcuni esempi.
|
Esegue il comando ls e conclude il funzionamento del programma. In pratica, le istruzioni successive a exec(), non vengono eseguite.
|
Invia il segnale SIGTERM al processo numero 588.
|
Esattamente come nell'esempio precedente.
|
Come nell'esempio precedente, ma il segnale viene inviato anche a tutti i processi discendenti da quello indicato.
|
Mette il programma in pausa senza specificare la fine di questa.
|
Mette il programma in pausa per 10 secondi.
|
Mette il programma in pausa per la quantità di secondi indicata dalla variabile $pausa.
|
Esegue il comando ls e poi riprende con il programma.
|
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.
|
Scompone l'array restituito da times() in quattro variabili scalari.
|
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.
Perl fornisce una serie di funzioni matematiche tipiche della maggior parte dei linguaggi di programmazione.
Tabella 361.8. Funzioni Perl di tipo matematico.
Nel seguito sono elencate le funzioni che si occupano di convertire dati in formati differenti.
Tabella 361.9. Funzioni Perl per la conversione dei dati.
Segue la descrizione di alcuni esempi.
|
Restituisce la lettera A maiuscola.
|
Restituisce il numero 175.
|
Restituisce il numero 175.
|
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.
Sono elencate nel seguito le funzioni che si occupano di gestire l'esecuzione delle espressioni (quando necessario) e di conoscerne alcune caratteristiche.
Tabella 361.10. Funzioni Perl per il controllo delle espressioni e delle loro caratteristiche.
Vengono elencate qui le funzioni che sono particolarmente dedicate alla gestione di array e hash.
Tabella 361.11. Funzioni Perl per la gestione di array.
Segue la descrizione di alcuni esempi.
|
Elimina dall'hash %miohash l'elemento rappresentato dalla chiave contenuta nella variabile $miachiave.
|
Verifica l'esistenza dell'elemento rappresentato dalla chiave contenuta nella variabile $miachiave, all'interno dell'hash %miohash. In caso affermativo esegue alcune istruzioni.
Nel seguito 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.
Tabella 361.12. Funzioni Perl per la gestione delle situazioni di errore.
Segue la descrizione di alcuni esempi.
|
Se lo spostamento nella directory /var/spool/lpd/ fallisce, visualizza il messaggio attraverso lo standard error e termina.
|
Esegue il contenuto del file prova.pl.
|
Se lo spostamento nella directory /var/spool/lpd/ fallisce, visualizza il messaggio e termina restituendo il valore uno.
Johan Vromans, Perl 5 Desktop Guide, O'Reilly & Associates
Appunti di informatica libera 2004.10.10 --- Copyright © 2000-2004 Daniele Giacomini -- <daniele (ad) swlibero·org>, <daniele·giacomini (ad) poste·it>
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] [violazione licenza] [translators] [docinfo] [indice analitico]