-+  Associazione
-+  Documenti
 |-  Modern Perl
 |-  Bibliografia
 |-  Articoli
 |-  Talk
 |-  Perlfunc
 |-  F.A.Q.
 |-  F.A.Q. iclp
-+  Eventi
-+  Community
-+  Blog
-+  Link
Corso di Perl



 


indietro

[10] Come faccio ad usare un'espressione regolare per togliere da un file i commenti in stile C?

Benché ciò possa effettivamente essere realizzato, è molto più difficile di quanto potreste pensare. Per esempio, questo programma di una sola riga

    perl -0777 -pe 's{/\*.*?\*/}{}gs' pippo.c

funzionerà in molti casi, ma non in tutti. Vedete, è troppo ingenuo per certi tipi di programmi C, in particolare quelli che contengono ciò che sembrano essere commenti all'interno di stringhe incluse tra virgolette. Per questo, avreste bisogno di qualcosa come questo, creato da Jeffrey Friedl ed in seguito modificato da Fred Curtis.

    $/ = undef;
    $_ = <>;
    s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $2 ? $2 : ""#gse;
    print;

Questo, naturalmente, potrebbe essere più leggibile con il modificatore /x, aggiungendovi spazi e commenti. Eccolo espanso, per cortese concessione di Fred Curtis.

    s{
       /\*         ##  Inizio di un commento /* ... */
       [^*]*\*+    ##  Non-* seguito da 1-o-piu` *
       (
         [^/*][^*]*\*+
       )*          ##  0-o-piu` cose che non iniziano con /
                   ##    ma terminano con '*'
       /           ##  Fine di un commento of /* ... */
     |         ##     OPPURE  diverse cose che non sono commenti:
       (
         "           ##  Inizio di una stringa " ... "
         (
           \\.           ##  Carattere preceduto da \
         |               ##    OPPURE
           [^"\\]        ##  Non "\
         )*
         "           ##  Fine di una stringa " ... "
       |         ##     OPPURE
         '           ##  Inizio di una stringa ' ... '
         (
           \\.           ##  Carattere preceduto da \
         |               ##    OPPURE
           [^'\\]        ##  Non '\
         )*
         '           ##  Fine di una stringa ' ... '
       |         ##     OPPURE
         .           ##  Qualsiasi altro carattere
         [^/"'\\]*   ##  Caratteri che non sono l'inizio di un commento, non cominciano una stringa, non sono il carattere \
       )
     }{defined $2 ? $2 : ""}gxse;

Una piccola modifica rimuove anche i commenti C++:

    s#/\*[^*]*\*+([^/*][^*]*\*+)*/|//[^\n]*|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $2 ? $2 : ""#gse;

vedi in inglese

AUTORE E COPYRIGHT

Copyright (c) 1997, 1998, 1999, 2000, 2001 Tom Christiansen e Nathan Torkington. Tutti i diritti riservati.

Questa documentazione è libera; puoi ridistribuirla e/o modificarla secondo gli stessi termini applicati al Perl.

Indipendentemente dalle modalitè di distribuzione, tutti gli esempi di codice in questo file sono rilasciati al pubblico dominio. Potete, e siete incoraggiati a farlo, utilizzare il presente codice o qualunque forma derivata da esso nei vostri programmi per divertimento o per profitto. Un semplice commento nel codice che dia riconoscimento alle FAQ sarebbe cortese ma non è obbligatorio.

D:
Progetti e documenti in rilievo
Corso di Perl Progetto pod2it
D:
La ML di Perl.it
mongers@perl.it è la lista ufficiale di Perl Mongers Italia per porre quesiti di tipo tecnico, per rimanere aggiornato su meeting, incontri, manifestazioni e novità su Perl.it.
Iscriviti!
D:
Annunci Google