Newsgroup: it.comp.lang.perl
Titolo: motore di ricerca (probabilmente la domanda è molto facile)

Ho scritto un motore di ricerca però avrei bisogno di un aiutino per
perfezionare un piccolo (ma rilevante) particolare:
l'utente arriva sul sito, scrive ad esempio "ciao mamma", io voglio
che il motore renda tutte i titoli che comprendono "ciao" OR "mamma",
al momento il giro che faccio fare è un po' lungo del tipo:
trasforma la frase ciao mamma sostituendo a tutti i caratteri non
alfanumerici il simbolo '|' (pipe), quindi la stringa diventa
"ciao|mamma" e poi eseguo questo controllo su tutti i titoli
nell'archivio:
if ((($GIOCO_X[$h])=~/\W($PATTERN)\W/i) ||
(($GIOCO_X[$h])=~/^($PATTERN)\W/i) ||
(($GIOCO_X[$h])=~/\W($PATTERN)$/i) ||
((($GIOCO_X[$h])=~/^($PATTERN)/i) &&
(($GIOCO_X[$h])=~/($PATTERN)$/i)))) {...}
Avrete già capito dove voglio andare a parare, c'è un qualcosa che mi
permetta di fare tutto questo senza dover fare questa serie di
controlli.
E per l'AND logico è anche peggio perchè faccio questo controllo per
ogni parola immessa e solo se tutte danno esisto positivo il titolo
viene resituito come risultato.
Deve per forza esistere una maniera più facile per risolvere il
problema (più facile dal punto di vista logico, e anche più veloce),
ho l'impressione di sprecare una marea di cicli del PC per cose che
potrebbero essere fatte in maniera molto più veloce, il problema è che
non so come.
Grazie a chi potrà aiutarmi
Ciao
Andrea

 (($GIOCO_X[$h])=~/($PATTERN)$/i)))) {...}
Ma invece di \W ^ $ etc non potresti usare .*? O non metterlo proprio?
O non ho capito niente?
Valerio




Rischieresti di passare il tempo facendo backtracking.
Piuttosto:
1) snellirei l'espressione assegnando $GIOCO_X[$h] a $_, per fare il matching
 "implicito". Non aumentera' la velocita' ma probabilmente rente tutto piu' 
  gradevole visualmente
2) Probabilmente dipende dal contenuto effettivo di $PATTERN, ma 
  /\b(?:$PATTERN)\b/i
  potrebbe essere, per l'OR, una soluzione 'pigliatutto', nel senso che
  dovrebbe permetterti di matchare parole intere, senza la necessita' di
  specificare i casi particolari di ^ e $
3) Noto ora l'ultimo &&: non bastava /^($PATTERN)$/i ?
4) Usare s///o potrebbe servire, dal momento che il pattern e' in una
   variabile.
5) Siccome non sembra che ti serva sapere cosa ha matchato, puoi pensare di
   usare (?:) per evitare il back-referencing.
In perlfaq6 c'e' un esempio a proposito del matchare tanta RE
contemporaneamente: prova a vedere se ci capisci qualcosa :) (io indaghero'!)
Tra l'altro, sono sicuro che sul Cookbook ci sia anche qualcosa.
Maurizio
-- 
Maurizio M. Munafo' / 
mmmu...@netscape.net
"Consider Phlebas, who was once handsome and tall as you" (T.S.Eliot)

O non ho capito niente?
COsě in caso di ricerca di "pippo" avrebbe trovato anche "mapippo" o
"pippolo", io volgio solo parole intere.
Ciao
Andrea

 wrote:
: trasforma la frase ciao mamma sostituendo a tutti i caratteri non
: alfanumerici il simbolo '|' (pipe), quindi la stringa diventa
: "ciao|mamma" e poi eseguo questo controllo su tutti i titoli
: nell'archivio:
Vuoi essere sicuro di aver matchato proprio 'ciao' e 'mamma' e non delle
sottostringhe? Allora usa '\bciao\b' e '\bmamma\b'.
-- 
Nando Santagata: Telemastica & infornatica
Key fingerprint = C2 D9 C0 8E D5 B7 04 97  AF E8 3F 3E AF 4E 7F 9E
finger nando (at) mail (dot) ipers (dot) net   for my PGP public key
Home: 
http://www.ipers.net/~nandos

 "pippolo", io volgio solo parole intere.
Ah... non avevo capito niente! :P
Valerio

contemporaneamente: prova a vedere se ci capisci qualcosa :) (io indaghero'!)
Che pandemonio! :-)))
Ciao
Andrea

 Che pandemonio! :-)))
Piu' semplice di quel che sembri.
