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



 


indietro

[2] Sto avendo dei problemi nel fare il match su più di una linea. Cosa c'è di sbagliato? regex, multilinea regexp, multilinea espressione regolare, multilinea

O non avete più di una linea nella stringa che state prendendo in considerazione (verosimilmente), oppure non state usando il modificatore/i corretto nel vostro pattern (forse).

Ci sono molti modi per ottenere dei dati con più linee in una stringa. Se volete che ciò avvenga automaticamente mentre leggete l'input, vorrete impostare $/ (verosimilmente a '' per i paragrafi oppure ad undef per l'intero file) per darvi la possibilitaà di leggere più di una riga alla volta.

Leggete perlre: vi aiuterà a decidere quale tra /s e /m (oppure entrambi) potreste voler usare: /s permette al punto di includere i ritorni a capo e /m permette al segno d'omissione (^, NdT) ed al simbolo del dollaro di effettuare il match in prossimità di un ritorno a capo, non solo alla fine della stringa. Dovete tuttavia assicurarvi di avere veramente una stringa con più linee.

Per esempio, questo programma individua le parole duplicate, anche se esse sono ripartite tra le interruzioni di linea (ma non se lo sono tra le interruzioni dei paragrafi). Per questo esempio non ci serve /s, perché non stiamo usando il punto in un'espressione regolare che vogliamo attraversi i confini di linea. Non ci serve neppure /m perché non vogliamo che il segno d'omissione o il simbolo del dollaro effettuino il match in un qualsiasi punto all'interno del record vicino ai ritorni a capo. Ma è imperativo che $/ sia impostato a qualcosa di diverso rispetto al valore predefinito, altrimenti non riusciremo mai a leggere un record composto da più linee.

    $/ = '';  		# memorizza piu` dell'intero paragrafo, non solo una linea
    while ( <> ) {
	while ( /\b([\w'-]+)(\s+\1)+\b/gi ) {  	# la parola inizia con un carattere alfanumerico
	    print "$1 e` un duplicato, al paragrafo $.\n";
	}
   }

Qui c'è il codice che trova le frasi che iniziano con "From " ["da", NdT] (che dovrebbe essere storpiato da molti programmi di posta):

    $/ = '';  		# memorizza piu` dell'intero paragrafo, non solo una linea
    while ( <> ) {
	while ( /^From /gm ) { # /m fa si` che ^ effettui un match vicino a \n
	    print "primo from nel paragrafo $.\n";
	}
    }

Qui c'è il codice che trova ogni cosa tra START [inizio, NdT] ed END [fine, NdT] nel paragrafo:

    undef $/;  		# memorizza l'intero file, non solo una linea od un paragrafo
    while ( <> ) {
	while ( /START(.*?)END/sgm ) { # /s fa si` che il . attraversi i confini di linea
	    print "$1\n";
	}
    }

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