Newsgroup: it.comp.lang.perl
Titolo: Ricerca: un problema (e magari date un voto allo script)

ciao,
magari qualcuno di voi riesce a togliermi questo dubbio (nonche'
problema) assillante !
ho un database (semplice) in formato .csv dove i campi sono separati da
\t.
ES:
NOME    COMUNE    INDIRIZZO    WEB
mattia    verona    via di qua, 13    
http://blablalba
...
..
.
devo fare una ricerca in questo database e pubblicare i dati sul web
(banale!).
Il mio problema e' che nonostante innumerevoli chomp l'ultimo campo di
tutti i record contiene ancora un qualche bastardissimo carattere che mi
rovina tutto !!!!! come faccio a eliminarlo ??????
Ecco il codice (questo lo posto perche fra le altre cose, siccome sono
alle prime armi vorrei chiedervi anche un voto...)
i problemi li ho dove ho messo i commenti con ----------->
#   R I C E R C A  #
# - prende in entrata un puntatore ai dati gia' parsati del form;
# - ritorna un puntatore ad un AoH coi risultati ed un puntatore ad un
Hash con i titoli ordinati.
sub Search {
use FileHandle;
 my($punt_form) = @_;     # arrivano: il nome del file_db e un puntatore
a %form
 my($result);
 my($file) = new FileHandle ($punt_form->{'DB'}) || die
&error('Impossibile aprire il database');
 chomp($line = <$file>);#----------------------> primo chomp per i
titoli!!
 my($titoli) = hashdititoli($line);   # prima riga del database
 chomp(@lines = <$file>); #----------------------> primo chomp per gli
altri dati !!
 close ($file);
LINE:foreach $riga(@lines) {     # altre righe di database
  $hash_dati = creahash($riga,$titoli);
  foreach $key(keys(%$punt_form)){  # ricerca
   chomp($key);
#---------------------------------------------------->secondo chomp
!!!!!!
####--->questa if mi serve per trovare solo i record di persone con sito
web
   if ($key =~ m/WEB/ && $punt_form->{$key} ne '')
{#------------------>  se metto if ($key eq 'WEB'...) non funziona
    next LINE if ($hash_dati->{$key} !~ m"(http://|javascript:).*");
    next;
    }
   next if ($punt_form->{$key} eq '' || $hash_dati->{$key} eq '');
   next LINE if ($hash_dati->{$key} !~ m/$punt_form->{$key}/i);
   }
  push(@$result,$hash_dati);
 }
 return ($result,$titoli);
}
###################################################################
# CREA UN HASH ORDINATO CON 0..9 COME KEYS E I TITOLI COME VALUES #
###################################################################
sub hashdititoli {
 my($line) = @_;
 my(@titoli) = split(/\t/,$line);
 my($elemento,$return,$x) = ('',{},0);
 foreach $elemento(@titoli) {
  $return->{$x} = $elemento;
  $x++;
 }
 $return;
}
#######################################################################################
# CREA UN HASH ORDINATO CON I TITOLI COME KEYS E I DATI DI UNA RIGA DI
DB COME VALUES #
#######################################################################################
sub creahash {
 my($line,$titoli) = @_;
 my($return) = {};
 my(@dati) = split(/\t/,$line);
 for ($i=0;$i<@dati;$i++) {
  $return->{$titoli->{$i}} = @dati[$i];
 }
 $return;
}
  #
 ###     F I N E   R I C E R C A
#########################
GRAZIE A TUTTI
Mattia

 ###################################################################
Hash ordinato e' un'altra contraddizione. Se ti serve qualcosa di ordinato,
usa un array! Tanto non e' che l'ordine delle colonne cambia, mi sembra.
Per ora dovrebbe bastare.
Maurizio
-- 
Maurizio M. Munafo' / 
mmmu...@netscape.net
"Consider Phlebas, who was once handsome and tall as you" (T.S.Eliot)

 "Consider Phlebas, who was once handsome and tall as you" (T.S.Eliot)
allora cosa ne pensi ??
ciao e grazie
Mattia
PS: ho un po' lo script e la mia precedente mail per rendere questa un po' piu'
leggibile....

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

problema) assillante !
Se stai usando windows il carattere di fine chiusura è la sequenza
"\r\n" quindi chomp non basta.
usa
$LINEA=~s/\n|\r//g;
Ciao
Andrea

 allora cosa ne pensi ??
 Non e' che si possa valutare solo da un paio di funzioni.


 "Consider Phlebas, who was once handsome and tall as you" (T.S.Eliot)
Aloha e grazie !
Mattia