Newsgroup: it.comp.lang.perl
Titolo: Aiuto su espressioni regolari

Salve,
supponiamo che io abbia una stringa di tipo /public/giuseppe/pippo.cgi e
un'altra di tipo pippo.cgi.
Come faccio ad ottenere /public/giuseppe/ ?
Si considera anche la possibilita' di avere una prima stringa di tipo 
/public/pippo.cgi/giuseppe/pippo.cgi   In tal caso devo sempre togliere
solo l'ultimo pippo.cgi.
Grazie

Con le regex ???
my $s1='/public/pippo.cgi/giuseppe/pippo.cgi';
my $s2='pippo.cgi';
my $s3;
($s3=$s1)=~s/(.*)$s2$/$1/;
print $s3;
Insomma alla fine $s3 contiene '/public/pippo.cgi/giuseppe/'
Alex
Giuseppe Costantino ha scritto nel messaggio ...


quando si hanno pattern come $s2 (pippo.cgi) e' il caso di usare pero' la
funzione quotemeta che metto un bel backslash prima dei caratteri
particolari (es. il punto di pippo.cgi)..
Insomma il programma che ho postato funziona ma e' un caso generale ed
esemplificativo, poi ovviamente va modificato secondo richiesta.... In
questo caso ad esempio il quotemeta non era facoltativo. (ci sono anche
delle alternative al quotemeta).
my $s1='/public/pippo.cgi/giuseppe/pippo.cgi';
my $s2=quotemeta 'pippo.cgi';
my $s3;
($s3=$s1)=~s/(.*)$s2$/$1/;
print $s3;
senza quotemeta infatti $s2 avrebbe anche accettato .../.../pippoacgi o
pippobcgi o pippoZcgi etc....
Alex
P.S. devo smettere di rispondere alle 2.08 di sera !!! Solo che arrivo a
quell'ora quando faccio dei programmi (in c++) che hanno dei problemi, non
mi do pervinto e continuo e arrivo a degli orari incredibili, poi dico: ma
diamo un'occhiata alla posta ed al NG ! (poi dormo...)
Alex ha scritto nel messaggio ...


 pippobcgi o pippoZcgi etc....
    Ma che dici? Non avevo mai sentito parlare di quotemeta, ma non mi torna
quello che dici. Ho fatto delle prove e pippoacgi non lo accetta affatto a
prescindere dal quotemeta. Illuminatemi perche' la questione mi interessa
assai.
_dave_

prescindere dal quotemeta
Che prove hai fatto ???
Ti assicuro che funziona senza quotemeta e non con il quotemeta.
Ti ricordo che lo scopo era quello di dato
'/public/pippo.cgi/giuseppe/pippo.cgi' restituire dato
'/public/pippo.cgi/giuseppe/'
E poi se non hai mai sentito parlare di quotemeta e' meglio che ti
documenti, e' una delle funzioni built-in del perl !!!
Insomma, il . significa (in una regex) 'qualsiasi carattere', quotemeta lo
trasforma in \. che significa il carattere punto vero e proprio.
Alex
Lost Time ha scritto nel messaggio ...


 print $s3;
nella regex, prima viene interpolata la variabile $s2
e diventa s/(.*)pippo.cgi$/$1/
poi tutto passa al motore specifico.
nelle regex il punto è il metacarattere "qualsiasi carattere escluso \n"
quindi in questo caso andrebbe a sostituire anche stringhe come
/../../../pippoacgi
/../../../pippo		cgi
/../../../pippo/cgi
ecc..
quotemeta aggiunge una backslash ad ogni carattere non [a-zA-Z_]
ergo dentro la regex il "." diventa "\." e con una backslash davanti
ogni metacarattere perde la sua connotazione speciale per diventare
un simbolo normale (in questo caso un semplice punto).
a questo punto la regex sostituisce unicamente stringhe che finiscono
esattamente in 'pippo.cgi'
in ogni modo puoi usare questa forma senza sostituzione :
my $all = '/public/pippo.cgi/giuseppe/pippo.cgi';
my $pat = 'pippo.cgi';
my ($res) = $all =~ /(.*)\Q$pat\E$/;	# \Q ... \E è equivalente a quotemeta
print $res;				# e se lo togli, la regex funziona
				# (erroneamente) anche se $pat = 'pippoacgi'
-- 
Posted from qmailr@[195.223.140.135] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG