Newsgroup: it.comp.lang.perl
Titolo: $stringa è già contenuta in pippo.txt?

Salve a tutti, scusate la domanda da principiante.
Dunque, io ho il mio redirect.txt strutturato così:
pippo 
indi...@e-mail.com
pluto 
indi...@e-mail.com
paperino 
indi...@e-mail.com
e via così (in effetti redirec.txt non è molto originale!).
Il mio CGI serve per automatizzare l'aggiunta di alias e-mail. Semplice, apro il
redirect.txt e accodo la riga che voglio aggiungere. Però vorrei controllare se
l'alias scelto non è già in uso. Come faccio?
Insomma, non ci possono essere due paperini (per esempio)!
Come risolvo la cosa? Potrei fare una 'ricerca' all'interno di <FILEHANDLE>,
però magari pippo ha come e-mail 
pape...@e-mail.com
 e il test non funziona.
Pensavo quindi di leggere la prima parola di ogni riga e controllare se non
esiste già. Perfetto, direte voi, però non so come fare!
Mettiamo il caso che $alias contenga il nuovo alias e $email contenga la nuova
e-mail. Come mi muovo?
Grazie mille!!
Se non ci foste voi...
--
Umberto Meroni
[
http://www.ubi1k.com
] [
http://www.ubi1k-vb.net
]
[
webm...@ubi1k.com
] [ICQ: 14660006]
[MSN Messenger: 
ub...@hotmail.com
]
[per contattarmi: 
http://www.ubi1k.com/meroni
]

 però magari pippo ha come e-mail 
pape...@e-mail.com
 e il test non funziona.
vuoi controllare pure che alias e e-mail rispettino qualche regola?
semplice: applicala!

 close(FILEHANDLE);
Ache pro leggere tutto e riscrivere tutto?
Non è sufficiente verificare che non esista già e, se disponibile, accodare (in
append) la riga?


 append) la riga?
Certo. Ma quello di Antonio e' un esempio di approccio, basato sui soliti
dati incompleti. Puoi anche solo appendere, se sai quello che fai.
Maurizio
-- 
Maurizio M. Munafo' / 
mmmu...@netscape.net
"Consider Phlebas, who was once handsome and tall as you" (T.S.Eliot)

 Ovvero: "se non esiste gia' un entry nell'hash, creala!"
Non vorrei sembrare stupido (!), ma non ho capito il senso di quella riga.

 Non vorrei sembrare stupido (!), ma non ho capito il senso di quella riga.
   $pippo or $pippo = $pluto;    
significa che se $pippo e' vero, non fa nulla, altrimenti esegue 
$pippo = $pluto.
Nel caso in questione, se $miohash{$alias} esiste e contiene un valore
'definito' (e sperabilmente non uguale a "" o "0"), allora passa oltre,
altrimenti fa l'assegnazione.
Il mio appunto ad Antonio e' che se $miohash{$alias} non esiste, si sta
facendo accesso ad un 'undef' e dovrebbe apparire un warning (non ho provato)


     $miohash{$alias} or $miohash{$alias}=$email;
ammetto che il tutto sia un po criptico.
all'inizio ci ho impiegato anch'io qualche tempo a capire l'utilità di questo
modo di scrivere certe parti di codice, ma adesso mi ci sono abituato e mi piace
pure.
(in particolare mi piace esteticamente la frase "open or die" = 'aprire o
morire'!)
ma come dice il caro LW: ci sono più modi per fare le cose (cspmdflc :-)

 Non vorrei sembrare stupido (!), ma non ho capito il senso di quella riga.
ci provo a spiegarla io (forse come principiante ho un modo di pensare simile al
tuo)
se scrivo cavolate, correggetemi!
allora:
i) il perl è parsimonioso nella valutazione di espressioni booleane.
vuol dire che in "A or B" essendo sufficiente che sia soddisfatta una delle due
condizioni, perl ignora B se scopre che A è già 'vero'
ii) inoltre perl restituisce non ha veri e propri valori booleani, ma considera
"vero" tutto ciò che NON sia uguale a 
"" (stringa vuota) o 
"0" (zero come stringa o 
0  (zero come valore numerico)
iii) inoltre, perl restituisce sempre un valore quando fa qualcosa (di solito lo
ingoriamo allegramente, perché non sapremmo proprio cosa farcene)
anche la semplice assegnazione di un valore ad una variabile restituisce un
risultato, che in pratica ti permette di capire se le cose sono andate bene o
male
mettendo insieme i tre pezzi, se ne deduce che:
se $miohash{$alias} è vuoto (attento! in questo caso non sappiamo se la 'cella'
$miohash{$alias} esista o meno!)
allora la prima condizione è falsa e dunque il caro perl è obbligato a 'vedere
le carte' della seconda espressione.
per vedere le quali deve fare l'assegnazione
ecco fatto!
PS: il risultato booleano di tutta questa bella cosa lo buttiamo al vento! sono
abbastanza convinto che usarlo non avrebbe molto senso in quanto sarebbe sempre
"vero" (nel nostro caso, s'intende)
spero che adesso il tutto sia meno 'criptico'
esiste un 'sorgente' tipico in perl, che rispecchia tale approccio alle
'condizioni'
open(FILEHANDLE,'nomefile') or die "Mannaggia! Non riesco ad aprire il file
'nomefile' in lettura!";
in questo caso se per qualsiasi motivo non riesce ad apire il file 'nomefile'
allora open restituisce zero, dunque 'falso' e allora va a 'vedere' la seconda
parte, la quale conclude l'intero script mandando allo stderr la frase che vedi.
E anche in questo caso il risultato dell'espressione booleana lo buttiamo al
vento.
ciao, antonio