Newsgroup: it.comp.lang.perl
Titolo: Rimuovere commenti

Dovrei rimuovere i commenti da un file sorgente.
I commenti iniziano con il carattere # e continuano fino a fine riga.
Per la verita' non uso Perl, ma vorrei comunque farlo con una RegEx.
Il problema e' che il carattere # puo' apparire anche in una stringa e in
quel caso non e' chiaramente un commento.
Avevo pensato ad una soluzione per matchare tutte le righe che contenessero
il carattere # preceduto da zero o un quantitativo pari di doppi apici (").
Purtroppo la regex che ho creato fa bloccare l'engine di ricerca.
Qualcuno ha qualche soluzione?
Non ho sotto mano la RegEx che avevo passato al compilatore, ma e' qualcosa
tipo:
^((\"[^\"]*\")[^\"#]*)*(#.*)$
la sintassi non so se e' proprio simile a quella del Perl, ma a senso e':
inizio riga
un gruppo contenente zero o piu':
    un gruppo contenente qualsiasi carattere (tranne doppi apici) compreso
tra doppi apici
    qualsiasi carattere che non sia doppi apici o l'inizio del commento
carattere #
qualsiasi altra cosa
fine riga
Grazie e ciao, Morusaka.

 
Mi sembra un compito piuttosto arduo da realizzare con una regexp. 
Considera che le stringhe possono anche inizare con qq/, q/, qr/, qw/, 
dove, peraltro, il delimitatore non deve necessariamente essere '/', ma può 
anche essere '#'. Stesso discorso per s/ e tr/. Inoltre una stringa può 
estendersi per più di una riga. Nota, poi, che '#' compare anche in 
espressioni come '$#array' e nelle variabili predefinite '$#', '$#-', etc. 
La cosa migliore, per me, è fare uno script che implementi la seguente 
logica:
   finché non arrivo alla fine
   {
        - cerco la prossima cosa che possa essere l'inizio di un commento
           o l'inizio di una stringa
        - se è l'inizio di una stringa avanzo fino alla fine della stringa
          (tenendo ovviamente conto degli eventuali escape; ad es, \")
        - altrimenti se è un commento avanzo fino al prossimo a-capo
   }
Max

Scusa, forse mi sono spiegato male.. non devo togliere i commenti da un
sorgente Perl, ma da un file RIB (RenderMan Interface Bytestream). In questo
caso il discorso e' che le stringhe iniziano e terminano solo con i doppi
apici, quindi e' piu' facile.
Se esistesse un modo per farlo efficaciemente con una RegEx ne sarei ben
contento. So bene che sarebbe sufficiente un ciclo di copia con uno switch
sul carattere che leggo, ma mi piaceva (se possibile) farlo con una RegEx!
;-)
Grazie, spero tu o qualcun'altro mi sappia indicare una soluzione,
Morusaka.


 doppi apici, quindi e' piu' facile.
Beh, così è facile. Se le stringhe NON possono contenere dei doppi apici 
con escape (\"), la regexp sarà molto semplice:
  s/(".*?")|#.*$/$1/gm
Ossia: cerco quacosa che sia un blocco "..." oppure un commento e lo
sostituisco con $1, che nel caso del commento è vuoto.
Se le stringhe possono contenere dei \", bisogna complicarla un po', ma 
si può fare.
Max

 ha scritto nel messaggio
news:cgo7n0$d0i$1...@newsreader.mailgate.org...


 \n, \", \t e cosi' via..
In tal caso bisogna modificare la prima parte. Anziché '(".*?")', potremmo 
usare qualcosa come
          ("([^"\\]|\\.)*?")
Ossia: due '"' che racchiudono una sequenza di blocchi ciascuno dei quali č 
composto da un carattere diverso da '"' e da '\' oppure da un '\' seguito 
da un qualsiasi carattere.
 ~$ perl -npe 's/("([^"\\]|\\.)*?")|#.*$/$1/g'
 bla bla "#bla \"  #bla"  # commento
 bla bla "#bla \"  #bla"
Max

 ha scritto nel messaggio
news:cgpbr4$i5c$1...@newsreader.mailgate.org...
