Newsgroup: it.comp.lang.perl
Titolo: problema con regexp

Ciao a tutti,
vengo subito al dunque esponendo il mio problemino:
ecco la parte di script incriminata (tenete presente che ovviamente $stringa
è la stinga da dove cercare e $cerca è quella da cercare):
while($stringa=~ /$cerca/gi){
      $contatore ++;
      $responso = 1;
}
In questo modo in seguito facendo un controllo su responso e su contatore
vengo a sapere se vi sono corrispondenze e (se vi sono) quante ce ne sono.
(vi chiederete: ma non bastava la variabile contatore per poi fare il
controllo if ($contatore > 0)? Per darvi una risposta dovrei copiare tutto
lo script quindi sappiate solo che mi servono entrambe le variabili!!)
Ovviamente tutto funziona tranquillamente , ma avrei la necessità di
ignorare alcune parti della stringa, in particolare le parti racchiuse tra 2
parentesi tonde.
Mi spiego meglio:
$stringa="parte in cui cercare (prima parte da ignorare), seconda parte in
cui cercare (seconda parte da ignorare)"
in questo caso, se volessi fare in modo che le corrispondenze nelle due
parti tra parentesi vengano ignorate, come posso fare?
Ho già guardato Perlre ma senza cavare un ragno dal buco!!
Grazie 1000
SK

parentesi tonde.
Saro' breve anche io: se non sai come risolvere un problema prova ad
inventarti una soluzione. Io ti dico la prima che mi e' venuta in mente, ce
ne saranno molte altre, ma l'importante e', se non sei un mago delle regex,
mantenere le cose semplici !
Dunque, il modo piu' semplice di pensare la cosa e' il seguente:
Conto quante volte $cerca appare in $stringa, conto anche quante volte
appare tra parentesi tonde e poi so che il numero che mi interessa e' il
primo numero - il secondo:
########################
# GTH presenti     = 7 #
# GTH in parentesi = 3 #
# GTH risultanti   = 4 #
########################
my $stringa="fds GTH j GTH (lj GTH d) GTH kj(GTH)ds (kl_GTH_jh) fd (sk)
fjs->GTH<-kld";
my $cerca="GTH";
my $contatore_tmp=0;
my $contatore=0;
my $responso=0;
$contatore_tmp++ while($stringa=~ /\(.*?$cerca.*?\)/gi);
$contatore++ while($stringa=~ /$cerca/gi);
$contatore-=$contatore_tmp;
($contatore)?($responso=1):($responso=0);
print "Sono stati trovati $contatore $cerca (fuori dalle parentesi)!\n";
print "Il responso e' $responso\n";
Bene, questo programma, fa proprio quello che volevi tu, no ?
Il fatto e' che questo programma va bene nel caso in cui ti interessa solo
sapere se e QUANTE sono le occorrenze di GTH fuori dalle parentesi.
Immaginiamo pero' che ti serva anche lavorare su tali occorrenze, allora
forse e' piu' comoda una cosa del genere:
########################
# GTH presenti     = 7 #
# GTH in parentesi = 3 #
# GTH risultanti   = 4 #
########################
my $stringa="fds GTH j GTH (lj GTH d) GTH kj(GTH)ds (kl_GTH_jh) fd (sk)
fjs->GTH<-kld";
my $cerca="GTH";
my $contatore=0;
my $responso=0;
my $tmp=$stringa;
$tmp=~ s/\(.*?$cerca.*?\)//gi;
$contatore++ while($tmp=~ /$cerca/gi);
($contatore)?($responso=1):($responso=0);
print "Sono stati trovati $contatore $cerca (fuori dalle parentesi)!\n";
print "Il responso e' $responso\n";
print $stringa."\n";
Questo programma invece salva il contentuto di $stringa in $tmp (per non
modificare la stringa originale) e poi cancella da $tmp tutte le occorrenze
di GTH tra parentesi. Quindi in $tmp rimangono solo quelle valide, ed ora
(con questo secondo programma) puoi anche lavorarci sopra (se ti interessa
usarle e non stampare solo quante sono).
In fine esegue la print di $stringa per dimostrare (anche se e' banale) che
non ha alterato la stringa originale!
Devo anche dirti che la regex che ho utilizzato l'ho fatta in 3 secondi e
quindi e' fatta male, in altre parole non supporta la nidificazione delle
parentesi etc... Insomma ha parecchi bachi, ma quello che volevo fare era
darti solo lo spunto.
So di non aver "realmente" risposto alla tua domanda: il mio e' uno
stratagemma e non una espressione regolare !!! Il fatto e' che alcune volte
con uno stratagemma risolvi il problema in 10 secondi, pensando invece (in
modo poco elastico a volte) di risolverlo in modo "reale" ci si perde dei
giorni a pensarci sopra e a studiarlo.
In altre parole questo e' un consiglio che ti sto dando, usare metodi
alternativi !
Non nascondo che in questo momento non saprei risolvere questo problema in
modo "reale", insomma dovrei pensarci su parecchio (con risultato non certo)
e non ne ho certo voglia! Primo perche' non serve a me (eh gia!), secondo
perche' c'e' un metodo alternativo molto semplice !!!
Alex

 perche' c'e' un metodo alternativo molto semplice !!!
Hai risposto eccome, più che altro a me occorreva un metodo per fare quello
che mi serviva, e pensavo che il modo più agevole fosse con le regexp ma mi
va più che bene qualsiasi soluzione se il risultato è quello a lungo
cercato!!
Mille grazie, non avevo proprio pensato a metodi alternativi, ora invece mi
hai dato uno spunto sul quale lavorare (e se ci ripenso mi pare una cosa
piuttosto banale!!)!!
Ancora grazie!!
Ciao
SK

 ($contatore)?($responso=1):($responso=0);
Ehehe...
 
$responso=($contatore)?1:0;
KIS: risparmi ben 14 caratteri!!!!
A parte le battute, a me sembra piu' elegante cosi' .
-- 
Saluti,
Giancarlo

A parte le battute, a me sembra piu' elegante cosi'
Mi meraviglio di te! Si poteva anche scrivere :
$responso=1 if($contatore);
Tanto $responso era gia' inizializzato a 0 !!! Questo e' ancora piu'
elegante !!!
Inoltre a me sembrava piu' elegante non metterlo proprio, tanto c'e' gia'
contatore, ma Skatman ha espressamente richiesto tale var !!! boh !?!?
Io accetto molto volentieri le critiche, ma quelle costruttive! Il codice
che io ho postato rappresenta un metodo "alternativo" non e' certo il metodo
migliore, anzi....
Quindi, quello che voglio dire e' che di materiale ce ne era tantissimo su
cui lavorare, rispondere e criticarmi costruttivamente. Tu hai scelto invece
di criticarmi su di una cosa minima e superflua, che va bene uguale in
entrambi i modi.
Alex
P.S. sei percaso un po' permaloso ?

Spero che non lo sia tu ;)
Io no, ma qualcuno forse si.
Alex