Newsgroup: it.comp.lang.perl
Titolo: Cancellare ultima riga di un file

prendo un file di testo
@dati=<F>;
ora devo sostituire o cancellare l'ultima riga  (righe separate da \n)
devo per forza fare un  loop e scrivere le righe una alla volta?...
non posso semplicemente  cancellare o sostituire l'ultima riga di @dati  ?
...
Grazie 1000 in anticipo.
Oxy

 posso semplicemente cancellare o sostituire l'ultima riga di @dati ?
Se devi solo cancellare l'ultima riga (e non devi per altre ragioni
leggere comunque tutto il file), ti basta identificare il penultimo
line-feed (assumendo che il file termini con un LF) e ridimensionare il
file con truncate(). Per trovarlo, puoi procedere per tentativi: ipotizzi
quella che potrebbe essere la dimensione massima di una riga, ti sposti di
tanto dalla fine, usando seek(), e inizi a cercare da lě. Se non trovi
nulla, provi spostandoti indietro un po' di piů.
Se invece devi comunque leggere il file, ti basta tener traccia della
posizione corrente prima di ogni lettura, tramite tell(), in modo che alla
fine sia nota la posizione dell'ultima riga, e usare quindi truncate() per
ridimensionare il file. Ad esempio:
 open( F, "pippo.dat" );
 my $lastpos;
 my @data;
 my $line;
 while( ! eof F )
 {
	$lastpos = tell F;
	$line = <F>;
	push @data, $line;
 };
 close F;
 open ( F, ">>pippo.dat" );
 truncate( F, $lastpos );
 close F;
Max

 non posso semplicemente  cancellare o sostituire l'ultima riga di @dati  ?
trovato!!!!!!!!!!!!!!!!
my $ref = \@dati;
my $n=$#dati;
$ref->[$n]="x";
grazie ugualmente:)

Oxy wrote:

E come la fai complicata....
$dati[$#dati]='x';
Oppure usa pop e push...
-- 
Saluti,
Giancarlo

 
Oh, beh, pensavo che il tuo problema fosse evitare di riscrivere tutto
il file.
Max

 Max
Non devo leggere tutto il file...  anzi dovendo farlo su diverse centinaia
di files ogni 5 minuti... ( se e' veloce anche ogni minuto)  mi serve il
metodo piu' veloce possibile, quindi presumo che se posso leggere e
modificare solo l'ultima riga sia piu' veloce.. o no?..
Si puo' fare?
Grazie
Ciao:-)

 Oppure usa pop e push...
boh!... mai usati (ultra-pivello)
Ciao:)

 leggere e modificare solo l'ultima riga sia piu' veloce.. o no?..
Nell'altro messaggio ti ho suggerito 2 tecniche: con una eviti anche di
leggere tutto il file, con l'altra risparmi soltanto la riscrittura.
La prima è leggermente più sofisticata da implementare.
Max

 La prima č leggermente piů sofisticata da implementare.
Ho visto, grazie:)... Ma mi sembra che nessuno dei due esempi soddisfa il
requisito che sarebbe  leggere e modificare l'ultima riga senza leggere
tutto il file. Il fatto e' che l'ultima riga (solo quellla)non devo
semplicemente cancellarla, devo prima leggerla per poi aggiungere quella
modificata, in pratica non la devo cancellare ma modificarla dopo averla
letta.
Credo che la soluzione piu' veloce sia leggere tutto il file e con $->[]
leggerla e modificarla, o no?
Ciao grazie

 $->[] leggerla e modificarla, o no?
Non direi. La mia soluzione ha prestazioni che non dipendono dalle
dimensioni del file. In sostanza la tecnica è analoga a quella usata dal
comando tail.
Max

 comando tail.
se funziona e' ottimo!... Anche se devo dire che  la funzione e' un livello
troppo complicato per me.. la devo prendere a scatola chiusa sperando che
funzioni... Grazie:)
Ciao


lo sto provando su Win... ma non mi funziona!..
Non aggiunge la riga e non produce sempre lo stesso risultato, spesso taglia
2 righe, altre volte una sola ma aggiunge un carattere non visualizzabile!
Inoltre non ho capito quale sarebbe l'ultima riga presa (che mi serve) prima
di essere cancellata.
P.s corretto l'errore in  ' print F scalar localtime, \n";  '
Ciao grazie cmq.

 prima di essere cancellata.
Quella che finisce nella variabile $line.
Max

 Quella che finisce nella variabile $line.
dunque: comincia a fungere... pero' il file lo devo aprire com nel primo
esempio
( open( F, "+<pippo.dat");     )
ora sembra cancellare...
Mi scuso per il  $line (guardando meglio potevo arrivarci a solo... ) ma
questa pero' mi ritorna l'ultima riga dopo la cancellazione, in pratica la
penultima!..
Un ultimo sforzo e ci siamo! Grazie :-)
Ciao
Oxy

ci sono arrivato!!!!...
 my $line = <F>;
 truncate( F, $lastpos );     # tronco il file
la prendo primadel truncate! :)
Grazie!!!!!!!!!!!!!
Ciao