Newsgroup: it.comp.lang.perl
Titolo: un aiuto su una regexp

Salve a tutti, ho un piccolo problema con uno script che sto creando.
Uso la seguente istruzione di sostituzione:
for $currnodep (@nodepslist)
{
 print "deleting dep: ",$currnodep,"\n"; 
 $curdata =~ s/(^LIBDEPS = ) *(.*) *(gnome\/$currnodep)/$1 $2/gm; 
 print $curdata;
}
dove @nodeplist e' definita come segue
@nodepslist=("pango","atk","glib","gtk\+");
Quello che io vorrei e' che modificasse una linea tipo
LIBDEPS = gnome/blahblah gnome/blahblah2 gnome/libxml2 gnome/gtk+
eliminando tutte le substring che sono definite in @nodepslist
sembra che funzioni tranne per la dipendenza gtk+ infatti non riesco a
fargli capire che il + fa parte della stringa da eliminare e non di una
regexp (ho provato anche a 'quotarlo' con il \) ma niente... in uscita
ottengo sempre un + sulla linea incriminata
qualcuno mi puo' illuminare?
grazie a tutti

ottengo sempre un + sulla linea incriminata
Dovrei verificare, ma cosě ad occhio direi che ci vogliono due \ (il primo
solleva il pelo, il secondo lo taglia).
Se @nodepslist č cosě breve, forse si puň anche pensare di inserirla
direttamente nell'espressione regolare, invece di fare un ciclo. Anche qui
perň dovrei avere un po' piů di tempo per verificare.
Ciao.

 Se @nodepslist è così breve, forse si può anche pensare di inserirla
no, l'ho accorciata per esemplificare il problema... le dipendenze da
eliminare sono parecchie di piu' ;-))))
grazie mille

il carattere 'quotato' dentro il comando s// vero?
Sì: perl (a differenza, per esempio, di C) consente di prefissare qualunque
carattere con '\'; se la sequenza non corrisponde a qualche carattere
speciale ("\n", "\t" e così via), il risultato è il carattere stesso. In
sostanza, "\c" eq "c", per qualunque carattere 'c' che non definisca una
speciale sequenza di escape.
Perché nella stringa compaia effettivamente un carattere escape, è
necessario usare la sequenza di escape "\\", che restituisce appunto un
'\'.
Ciao.

 avere il carattere 'quotato' dentro il comando s// vero?
Se usi solo uno \ l'interpolazione del double quoting (") te lo elimina.
Puoi eviatare il doppio \ usando un single quoting:
@nodepslist=('pango','atk','glib','gtk\+');
oppure (piu' bello)
@nodepslist= qw/pango atk glib gtk\+/;
cosa che per altro e' consigliabile in quando eviti al perl di fare
delle interpolazioni inutili (a meno che, ovvimante, al posto di una di
quelle parola non vuo mettere una variabile).
Inoltre, perche' al posto di:
$curdata =~ s/(^LIBDEPS = ) (.) *(gnome\/$currnodep)/$1 $2/gm; 
non usi
$curdata =~ s/gnome\/$currnodep//gm; 
anche questo mi sembra piu' semplice ed efficiente.
-- 
Saluti,
Giancarlo

 anche questo mi sembra piu' semplice ed efficiente.
uhm... ma in questo modo rischio che mi vada a cancellare _anche_ nelle
righe che non iniziano con 'LIBDEPS =' o sbaglio?
grazie delle info

 nelle righe che non iniziano con 'LIBDEPS =' o sbaglio?
Si, ma io non so cosa c'e' in $curdata ;-)
Ad ogni modo io manterrei la sostituzione semplice magari aggiungento un
controllo per giudicare se la riga e' o meno da trattare.
-- 
Saluti,
Giancarlo

 ottengo sempre un + sulla linea incriminata
Potresti utilizzare \Q
@nodepslist=("pango","atk","glib","gtk+");
$curdata =~ s/(^LIBDEPS = ) *(.*) *(gnome\/\Q$currnodep)/$1 $2/gm;
dai uno sguardo a perldoc -q regex
un saluto
Marco