Newsgroup: it.comp.lang.perl
Titolo: regex in perl

Ciao a tutti!
Io ho un file .txt in cui ho un testo (circa 3000 parole) in cui dopo ogni
parola c'č un ritorno a capo:
es:
questo
č
il
testo
,
con
i
ritorni
.
DOvrei racchiudere (utilizzando le regex (o altro) di perl) ogni frase
(parte del discorso racchiusa fra punti,punti interrogativi ed esclamativi)
all'interno di un tag xml
es:
<tag>
Ciao
!
</tag>
<tag>
Come
te
la
passi
?
</tag>
ad un primo passaggio faccio individuare a perl tramite una regex . ! ? e
gli faccio inserire:
\n<\/tag>\n<tag>\n
dopo ognuno di questi.
Il problema subito riscontrato č che in questo modo dopo il punto di fine
testo invece di avere solo il tag di chiusura mi trovo anche un tag di
apertura inutile e ad inizio testo invece non ho il tag di apertura.
es:
Ciao
!
</tag>
<tag>
Come
te
la
passi
?
</tag>
<tag>
Esiste un modo per inserire un tag di apertura ad inizio testo e togliere il
tag in piů a fine testo utlilizzando unra regex o qualcosa di simile?
Inoltre vorrei che automaticamente mi inserisse in prima riga il tag <? xml
.... ?>
e ad inizio e fine testo un tag radice di apertura e chiusura
Questo dovrebbe essere il risultato finale:
<?xml ....?>
<tag_radice>
<tag>
testo
testo
.
</tag>
<tag>
testo
testo
.
</tag>
<tag_radice>
Premetto di non essere un esperto in materia quindi vi supplico di essere
chiari!!
Grazie mille
Ciao
Die
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

e ad inizio e fine testo un tag radice di apertura e chiusura
Non capisco quale sia il problema. Che cosa ti vieta di stampare tutto
quello che vuoi mettere all'inzio prima di leggere la prima riga del file
dati, e stampare tutto quello che vuoi mettere alla fine dopo aver letto
l'ultima riga?
Ciao.

...
Correggo qualche piccolo errore:
      open HFILE, "< nome_file";
      my $inizio = 1; 
      while (<DATA>) {
        chomp;
        if ($inizio) {
           print "<tag>\n";
           $inizio = 0;
        }
        print;
        if ($_ eq '.' or $_ eq '!' or $_ eq '?') {
           print "\n</tag>";
           $inizio = 1;
        }
        print "\n";
      }
      close HFILE;
Ciao.

 Ciao.
Grazie mille per la risposta più che tempestiva però non ho capito molto
bene...
ho provato a sostituire nome_file con il nome del file sul quale voglio
operare ma il risultato è una pagina bianca. Avresti la voglia di spegarmi
lo script che mi hai gentilmente mandato perchè proprio non riesco a
capirlo.
Inoltre come si fa a "mettere all'inzio prima di leggere la prima riga del
file dati, e stampare tutto quello che vuoi mettere alla fine dopo aver
letto l'ultima riga?"
Grazie ancora per l'impresa mirabile!


letto l'ultima riga?"
  print "quello che ti pare all'inizio";
  fai_quello_che_vuoi_con_il_file_dati; #vedi ciclo sopra.
  print "quello che ti pare alla fine";
Ciao.


[CUT]
Se puň esserti utile per giocare un po' con
le regexp, prova a trattare il file come unica
stringa (... 3000 parole hai detto, non dovrebbe
essere eccessivo), tipo cosě...
------------------------------------------------------
# imposti le stringhe dei tag e il set di caratteri di fine frase
my ( $XML, $RADON, $RADOFF, $TAGON, $TAGOFF ) = ( '<? xml ... ?>',
'<tag_radice>', '</tag_radice>', '<tag>', '</tag>' );
my $CHARS = '.?!';
# qua i path dei file
my $file_in = '/file.txt';
my $file_out = '/file.xml';
my $stringa;
# qua ti "bevi" tutto il file nella var $stringa
open( FILE, "<$file_in" );
read( FILE, $stringa, ( -s $file_in ) );
close( FILE );
# qua inserisci i tag intermedi
$stringa =~ s/(.+?)([$CHARS])/$1$2\n$TAGOFF\n$TAGON/gs;
# qua sistemi i tag iniziali e finali
$stringa =~ s/(.+?)$TAGON$/$XML\n$RADON\n$TAGON\n$1$RADOFF/s;
# e qua ti crei il tuo xml
open( FILE, ">$file_out" );
print FILE $stringa;
close( FILE );
exit;
------------------------------------------------------
Ciao.