Newsgroup: it.comp.lang.perl
Titolo: Eliminazione di righe da un file di testo

Ho un file di testo molto semplice fatto come segue:
nome||attributo
nome2||attributo2
nome3||attributo
ecc.
A questo punto, da un form vorrei che, se i dati inseriti vanno in match
con una delle righe del file di testo, questa venisse cancellata o,
almeno, sostituita da una riga vuota.
Se ad esempio dal form mi arrivano i dati "nome2||attributo2", so che
devo cancellare la seconda riga, ma qui mi incarto! Il codice, fino ad
adesso, è (ovviamente $file è il file con le informazioni che devo
controllare ed eventualmente eliminare e $form una generalizzazione per
"i dati che mi arrivano dal form"):
open(FILE, "< $file")
@lines = <FILE>;
close FILE;
foreach $line (@lines) {
	if ($line eq $form) {
		# Adesso dovrei aprire il file ed eliminare la riga.
 
Sinceramente, ne ho provate tante ma la riga è ancora li bella come il
sole!
Qualcuno mi sa dare delle dritte su come fare una cosa del genere?
TIA
M.			
-- 
echo f 0:0 ffff 0 | debug
La leggerezza del VOLER essere ....


open(FILE, "< $file");
@lines = <FILE>;
close FILE;
open(FILE, "> $file");
foreach $line (@lines) {
	$line=~s/\r//g;   #attenzione
	$line=~s/\n//g;  #attenzione
	if ($line ne $form) {
		print FILE $line."\n";
	}
}
close FILE;
Ciao
Andrea Busia
No Spam, Grazie.

	$line=~s/\n//g;  #attenzione
Non hai mai sentito parlar di chop e chomp? sono funzioni fatte apposta per 
togliere gli "acapo" a fine linea leggendo da file o da STDIN.
chomp($line); 
fa la stessa cosa delle tue due sostituzioni.
-- 
Saluti,
Giancarlo

 o da STDIN.
  Non e` totalmente esatto. La funzione /chop/ rimuove l'ultimo
carattere di una stringa e lo usa come valore di ritorno mentre la
funzione /chomp/ rimuove dalla fine della stringa data il contenuto del
separatore di record in ingresso (variabile speciale $/).
  In ambiente UNIX /chop/ e /chomp/ con $/="\n" si equivalgono, ma e` un
caso particolare.
	Alla prossima,
		Marco

caso particolare.
Dire che si equivalgano non mi sembra esattissimo spesso si usano quasi allo
stesso mod e allo stesso scopo, ma:
Es:
$stringa="1234\n";
chop($stringa);
chop($stringa);
chop($stringa);
stringa diventa 12
chomp($stringa);
chomp($stringa);
chomp($stringa);
e stringa e' 1234.
(indipendentemente da quello che ritornano e indipendentemente dal SO)
Per il resto io ero (non so adesso) convinto che sotto win32 in $/ per default
ci fosse \r\n se non e' cosi' basta mettercelo, no? ;) pero' dovrebbe essere
cosi.... $/ e' il carettere usato per dividere l'input in casi tipo
$var=<FILEHNDL> quindi....
Comunque semplicemente mi sembrava "macchinoso" fare due sostituzioni anziche'
usare delle belle funzioni praticamente fatte ad hoc.
-- 
Saluti,
Giancarlo

 ad hoc.
  Tra l'altro, quelle due espressioni non sono proprio giustissime, in
quanto rimuovono le sequenze "\r\n" ovunque esse si trovino. Nel caso di
$/!="\r\n", infatti, il comportamento diventa confuso.
  Ad ogni modo, /chop/ e` stata resa obsoleta per lo scopo di cui si
tratta dall'uscita del Perl5.
	Alla prossima,
		Marco

tratta dall'uscita del Perl5.
Infatti si usa chomp, anche se si vede in giro ancora molto codice con chop
usato per togliere il \n.
-- 
Saluti,
Giancarlo

 con chop usato per togliere il \n.
  Perl4.
	Alla prossima,
		Marco

</code>
-- 
Saluti,
Giancarlo

 MVS o VMS? 
  MVS.
	Alla prossima,
		Marco

 wrote in message
| Si e' vero, anche se in effetti trovare un \r o un \n che
| non sia parte di un EOL e' molto raro.
mica tanto: in una rete mista UNIX <- SAMBA -> WIN, con i file testo
dell'uno o dell'altro sistema si avrebbero comportamenti differenti a
seconda del server in cui viene eseguito il cgi...
Si potrebbe leggere file cercando un'occorrenza di \n\r, e poi impostare
manualmente
$/=\n\r o $/=\n a seconda del risultato...
voi che ne dite?
Sandro

 No Spam, Grazie.
Figurati. Prego.
Anzi ... grazie mille a te!


 caso particolare.
Ma con chomp me la cavo lo stesso o è meglio se tengo le due
sostituzioni di \n e \r ?
Ciao e rigrazie!


 due sostituzioni di \n e \r ?
  *Devi* usare /chomp/.
	Alla prossima,
		Marco

 cerchero` un'altra donna dentro ai sogni di Tarzan...

 voi che ne dite?
Io uso sempre s/[\r\n]//g; #=:-)


 quando, prelevando, trasforma l'ABCDIC in ASCII.
                                  ^
  L'ABC dei dataset? :))
	Alla prossima,
		Marco

   L'ABC dei dataset? :))
o EBCDIC o come diavolo si chiama, quell'affare che ha il 64 per gli
spazi (per cui vedi un fottio di "@" nei file) :-\


   *Devi* usare /chomp/.
Deciso e diretto! ;-)
Vada per il chomp!
Grazie!


Fantastica come idea ;-)
Io scriverei su un altro file e poi lo sostituirei se sono sicuro che
tutto è andato bene.
Inoltre devi stare attento alla dimensione del file in input. Se è
troppo grosso che succede?
Ambrogio De Lorenzo
Professional Service Consultant
ART srl
Largo La Foppa 2
20124 Milano
Tel. 02-655676.1
e-mail: mailto:
ambrogio....@art-web.it

 troppo grosso che succede?
Niente: č flock()ato!
;-)


;-)
Si certo, ma la ram del computer?
Non so come si comporta il PERL in questi casi, usa file di appoggio o
altro?
Ciao
	Pirla
Per rispondere in E-mail the (punto) pirla (chiocciola) 
flashnet.it
*** un bacio ai pupi ***
---> Linux user since yesterday <---

 Si certo, ma la ram del computer?
Ma volete proprio rompere alla grande, eh? ;-))
Il file, stando a calcoli spannometrici, non supera le 100 righe, ognuna
delle quali ha non piů di 40 caratteri. Contenti? ;-))


delle quali ha non piů di 40 caratteri. Contenti? ;-))
 In generale, con file anche grossi, come si comporta l'interprete
PERL? (spero non come un pirl)...


 PERL? (spero non come un pirl)...
Hmmm, qui non siamo più all'user-level e, visto che non conosco troppo
bene manco quello, meglio se non provo neanche ad azzardare idee! Magari
qualcuno più esperto dirà la sua!
