Perl/File: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nuova pagina: 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: ...
 
Nessun oggetto della modifica
Riga 1:
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:
 
1) Apertura
 
2) Lettura/scritturaScrittura
3) Chiusura
 
3) Chiusura
 
L'azione di Apertura prevede diversi modi : in lettura , in scrittura , in aggiunta o misti
L'azione di Lettura/Scrittura si risolve con una istruzione.
L'azione di Chiusura è unica per tutti i tipi di Apertura. (Ricordarsi di chiuderli i files nonostante al termine del programma il Perl chiude tutto ciò che è rimasto aperto ).
 
==APERTURA in lettura (file di testo ASCII)==
Line 134 ⟶ 141:
 
print MIOFILE "Questo l'ho scritto io\n";
 
== APERTURA,LETTURA/SCRITTURA "mista" di un file ( di testo ) ==
 
E' 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)
 
open ( MIOFILE , "+>pippo.txt" ) || die ( "Non è stato possibile aprire il file pippo.txt : $!" );
 
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 :
$riga = <MIOFILE>;
posiziona il cursore al primo carattere successivo alla fine della riga e quindi alla succesiva 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:
seek ( FILEHANDLE , num_bite , dove );
 
num_byte : è il numero di byte del salto.E' un numero che può essere positivo o negativo a seconda di "dove"
NOTA:Attenzione che di 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 :
seek( MIOFILE , 0 , 0 ); # si posiziona all'inizio del file
seek( MIOFILE , 0 , 1 ); # si posiziona dov'è ora ! ( e rimane nel file )
seek( MIOFILE , 0 , 2 ); # si posiziona in fondo al file
 
Per sapere la posizione assoluta alla quale è arrivato il cursore (posizione dall'inizio del file) è possibile usare l'istruzione tell:
$numByte_Ora = tell( MIOFILE ); # Posizione attuale del cursore
Se tell incontra problemi ritorna un numero negativo.
Vediamo ora questo esempio che rendono meglio l'idea:
 
open ( MIOFILE , "+<pippo.txt" ) || die ( "Non \350 stato possibile aprire il file pippo.txt : $!" );
print "posizione appena aperto :".tell( MIOFILE )." \n";
seek ( MIOFILE , 0 , 2); # mi metto in fondo
print "posizione al fondo :".tell( MIOFILE )." \n";
seek ( MIOFILE , 0 , 0); # mi metto all'inizio
while ( $linea = <MIOFILE> )
{ print "--$linea--".tell(MIOFILE)."\n"; } # scrivo il file e mi metto in fondo
print "posizione fine :".tell( MIOFILE )."\n";
print MIOFILE "riga aggiunta\n"; # scrivo una nuova riga !
print "Ultima posizione valida :".tell( MIOFILE )." \n";
close ( MIOFILE );
 
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:
 
posizione appena aperto :0
posizione al fondo :70
--riga aggiunta
--14
--riga aggiunta
--28
--riga aggiunta
--42
--riga aggiunta
--56
--riga aggiunta
--70
posizione fine :70
Ultima posizione valida :84
 
NOTA: I numeri cambiano da macchina a macchina ...