Diversi moduli possono gestire questo tipo di analisi sintattica --- Text::Balanced,
Text::CSV, Text::CSV_XS e Text::ParseWords, tra gli altri.
Prendete l'esempio di tentare di estrarre da una stringa i singoli campi, che sono
separati da virgole. Non potete utilizzare split(/,/), poiché non
dovete dividere se la virgola si trova tra virgolette. Per esempio,
considerate una linea come la seguente:
SAR001,"","Cimetrix, Inc","Bob Smith","CAM",N,8,1,0,7,"Error, Core Dumped"
A causa della restrizione per quanto riguarda i caratteri tra virgolette,
il problema è piuttosto complesso. Fortunatamente, abbiamo Jeffrey
Friedl, autore di Mastering Regular Expressions, che si occupa della cosa per noi.
Suggerisce (ponendo che la vostra stringa sia contenuta in $testo):
@nuovo = ();
push(@nuovo, $+) while $testo =~ m{
"([^\"\\]*(?:\\.[^\"\\]*)*)",? # raggruppa la frase all'interno delle virgolette
| ([^,]+),?
| ,
}gx;
push(@nuovo, undef) if substr($testo,-1,1) eq ',';
Se desiderate inserire delle virgolette all'interno di un campo delimitato da
virgolette, usate dei backslash come escape (ad es. "in \"questo\" modo".
In alternativa, il modulo Text::ParseWords (contenuto nella distribuzione
standard di Perl) vi permette di scrivere:
use Text::ParseWords;
@new = quotewords(",", 0, $text);
C'è anche un modulo TEXT::CSV (Comma-Separated Values [valori
separati da virgola, NdT]) su CPAN.
|
|
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. |