# Perl/File

Perl
Copertina Bibliografia Tutti i moduli · Sviluppo
    CopertinaPerl/Copertina
* IntroduzionePerl/Introduzione
* C'è Perl?Perl/C'è Perl?
* Primo programma: Ciao Mondo!Perl/Primo programma: Ciao Mondo!
** Primo programma in un filePerl/Primo programma in un file
* VariabiliPerl/Variabili
** Variabili scalariPerl/Variabili scalari
** Variabili vettoriPerl/Variabili vettori
** Variabili hashPerl/Variabili hash
* IstruzioniPerl/Istruzioni
** Istruzioni minimePerl/Istruzioni minime
** Istruzioni compostePerl/Istruzioni composte
** Istruzioni racchiuse o bloccoPerl/Istruzioni racchiuse o blocco
** Istruzioni etichettaPerl/Istruzioni etichetta
** Istruzioni particolari su blocchi o etichettePerl/Istruzioni particolari su blocchi o etichette
** Istruzioni decisionaliPerl/Istruzioni decisionali
** CicliPerl/Cicli
* Applicare la teoriaPerl/Applicare la teoria
* FunzioniPerl/Funzioni
* Funzioni Native sulle variabiliPerl/Funzioni Native sulle variabili
** Funzioni Native su scalariPerl/Funzioni Native su scalari
** Funzioni Native su vettoriPerl/Funzioni Native su vettori
** Funzioni Native su hashPerl/Funzioni Native su hash
* FilePerl/File
* Espressioni regolariPerl/Espressioni regolari
** Espressioni regolari (oltre)Perl/Espressioni regolari (oltre)
** Espressioni regolari (contesto)Perl/Espressioni regolari (contesto)
Modifica il sommario
Questa parte tratterà la lettura/scrittura e gestione dei file.
In Perl questo tipo di operazione è stata semplificata al massimo, pertanto le operazioni da fare sono ridotte a tre:
* apertura: prevede diversi modi: in lettura, in scrittura, in aggiunta o misti
* lettura/scrittura: si risolve con una istruzione.
* chiusura: è unica per tutti i tipi di apertura (ricordarsi di chiudere i file nonostante al termine del programma il Perl chiude tutto ciò che è rimasto aperto).

## APERTURA in lettura (file di testo ASCII)

Per aprire un file si usa la funzione open.
Questa funzione richiede come parametri una "espressione", chiamata FILEHANDLE, per poter gestire il file, e il nome del file
NOTA: a essere espliciti occorrerebbe scrivere open ( MIOFILE , "<pippo.txt" ); ma la open di default è in lettura.
La funzione open ritorna un "false" in caso di problemi e imposta la variabile speciale $! che contiene il motivo indicato dal sistema operativo (es: file inesistente , non posso aprire il file, etc...)
oppure:
oppure ancora:
Sfruttando l'operatore || è possibile aprire un file o far uscire dal programma informando del motivo con una sola riga di codice:
che sicuramente ha una forma pulita.

## LETTURA di un file (di testo)

Una volta aperto senza problemi, per leggere il file si utilizza il FILEHANDLE. Questo è sensibile al contesto :
* se chi riceve il dato è uno scalare ritorna una riga
* se chi riceve il dato è un array ritorna tutto il contenuto del file, dove ogni riga del file è un elemento dell'array )
Vediamo:
oppure

### ATTENZIONE

    il FILEHANDLE viene usato tra < e > quando si legge!

## CHIUSURA di un file

Per chiudere un file si usa la funzione close che richiede il FILEHANDLE da chiudere. Infatti un programma può aprire più file alla volta.

## APERTURA in scrittura di un file (di testo)

Per poter scrivere in un file (NOTA: solo scrivere!) occorre aggiungere al nome file il simbolo '>' Vediamo un esempio:
ATTENZIONE: con questa operazione si è di fatto creato un nuovo file, vuoto, cancellando il vecchio.
Come nel caso della lettura, se non ritorna un false allora l'operazione è riuscita e pertanto è possibile applicare nello stesso modo i controlli:
oppure :
oppure :
oppure la più semplice :

## SCRITTURA di un file (di testo)

Per scrivere in un file è sufficiente utilizzare la print indicando il FILEHANDLE. Infatti se non specificato (di default) la print usa il video (STDOUT).

## APERTURA in aggiunta di un file (di testo)

Questa modalità è comoda per aggiungere linee a un file senza rimuoverne il precedente contenuto. Per farlo si possono usare i simboli '>>' prima del nome file:
Come nei casi precedenti è possibile fare i controlli che l'operazione si sia svolta correttamente:
etc ...

## SCRITTURA in aggiunta di un file (di testo)

Si usa lo stesso costrutto visto prima :

## APERTURA,LETTURA/SCRITTURA "mista" di un file (di testo)

È possibile aprire un file per leggerci e scriverci.
Queste modalità su di un file (di testo) sono tutte equivalenti. Come vi sarete accorti con le modalità precedenti, occorrerà mettere dei simboli ad indicare :
* '+<' lettura e scrittura # non crea un nuovo file (cursore all'inizio)
* '+>' scrittura e lettura # crea un nuovo file (cursore all'inizio)
* '+>>' aggiunta e lettura # non crea un nuovo file (cursore in fondo)
Ovviamente la scrittura "sovrascrive" il contenuto (non inserisce il nuovo testo) e quindi occorre usarla con cautela.
Ogni volta che leggiamo da file usiamo "inconsapevolmente" un cursore.
Per esempio quando leggiamo una riga con il codice :
posiziona il cursore al primo carattere successivo alla fine della riga e quindi alla successiva richiesta fornisce la successiva riga.
Per muoversi "agevolmente" nel file si usa la funzione seek che ha il preciso scopo di spostarsi nel file.
La funzione seek ha la seguente sintassi:
* FILEHANDLE assume lo stesso significato delle altre funzioni;
* num_byte è il numero di byte da saltare. È un numero che può essere positivo o negativo a seconda di "dove"
NOTA: si parla di byte e non di caratteri: il legame dipende dal sistema operativo!
* dove: se 0 indica inizio dall'inizio del file, se 1 indica dalla posizione corrente del file, se 2 indica dalla fine del file.
quindi:
Per sapere la posizione assoluta alla quale è arrivato il cursore (posizione dall'inizio del file) è possibile usare l'istruzione tell:
Se tell incontra problemi ritorna un numero negativo.
Vediamo ora questo esempio che rendono meglio l'idea:
Questo script scrive in fondo al file la riga "riga aggiunta\n" ma mostra il valore di tell man mano che si "scorre" il file (con la seek o con la semplice lettura ). Quindi lanciandolo più volte si otterrà questo risultato:

### NOTA

    I numeri cambiano da macchina a macchina ...