Newsgroup: it.comp.lang.perl
Titolo: pattern substitution

Ciao a tutti , ho iniziato da poco a lavorare in perl ed ho un
problema con le sostituzioni di stringhe in un file di testo.
Ho dei file xml con dei tag da eliminare,esempio:
<corpo> La Regione Piemonte esercita i relativi poteri di
accertamento, di riscossione e di utilizzo del gettito come previsti e
disciplinati dal <rif
xlink:href="urn:nir:stato:decreto.legislativo:1997-12-15;446">decreto
legislativo 15 dicembre 1997, n. 446</rif> (Istituzione dell'imposta
regionale sulle attività produttive, revisione degli scaglioni, delle
aliquote e delle detrazioni dell'IRPEF e istituzione di una
addizionale regionale a tale imposta, nonchè riordino della disciplina
dei tributi locali).</corpo>
voglio sostituire <rif
xlink:href="urn:nir:stato:decreto.legislativo:1997-12-15;446"> con
niente ; i casi sono molteplici potrei avere anche <rif
xlink:href="urn:nir:stato:decreto.legislativo:1992-04-30;285#art85">
Ho provato con questo script ma non funziona del tutto correttamente:
#!/usr/local/bin/perl
$stringa = "</rif>";
$sost = "";
print"Quale directoy devo stampare?";
chomp($MyDir=<STDIN>);
opendir(HOMEDI,"$MyDir");
my @files = readdir(HOMEDI);
closedir HOMEDI;
foreach (@files) {
if ($_ =~ /xml/) {
open (IN, "< $_") || die "Imp. aprire il file: $file.\n\n";
$new=$_;
  $new=~ s/\.xml/new\.xml/g;
open (OUT, "> $new") || die "Imp.creare $file.new\n\n";
while ($r = <IN>) {
  $r =~ s/$stringa/$sost/g;
  $riga=$r;
  $riga =~ s/(<rif xlink:href="urn:nir:.*#*")>/$sost/g;
  print OUT $riga;
	}
  close(IN);
  close(OUT);
  print "\n".$MyDir."\\".$_,"\n";}
}
Grazie
Beppe



Ciao :)
Non ho capito bene la natura della stringa che vuoi sostituire, ma forse
potresti usare una cosa simile:
s/<rif xlink:href="urn:nir:.*">/$sost/g
in quanto il carattere '#' non e' presente in entrambe le stringhe.
Altrimenti magari se provi a spiegare meglio cosa devi sostituire
riusciamo insieme a trovare una soluzione. Spero di esserti stato utile. 
Mithenks

Devo riuscire a eliminare tutti i blocchi <rif...> nel file xml
e possono essere in varie forme, ad esempio <rif
xlink:href="urn:nir:stato:decreto.legislativo:1997-12-15;446"> oppure
<rif xlink:href="urn:nir:regione.piemonte:legge:2001;7#art10-com3">
e non riesco a costruire l'espressione regolare che vada bene in tutti
i casi.
grazie x l'aiuto
Giuseppe

,
scriveva:

   s/<rif[^>]*>//g;
Con un po' di fortuna, potrebbe anche funzionare.
  s/<rif[^>]*>([^<]*)<\/rif>/$1/g;
Con un'altra buona dose di fortuna, questo potrebbe fare tutto il lavoro.
Come già detto in altra occasione, però, non vale proprio la pena
pasticciare con le espressioni regolari su formati complessi come xml o
html (espressioni ingenue come quelle sopra possono essere fatte fallire
con molta facilità). Conviene usare uno dei tanti moduli a disposizione a
questo scopo; ci si perde alla fine meno tempo, e i risultati sono più
sicuri. Per chi proprio non può fare a meno di reinventare la ruota, non
mancherà di darsi contesto più opportuno; il perl non è certo avaro di
certe occasioni.
Ciao.

Ciao Giovanni , potresti indicarmi uno dei moduli di cui hai scritto.
Grazie
Saluti

Ciao Giovanni , potresti indicarmi uno dei moduli di cui hai scritto.
XML::Parser, XML::Parser::Lite, XML::Simple, XML::Smart, XML::Ximple...
Ce n'è davvero per tutti i gusti, secondo la propria personale filosofia e
il compito che si deve svolgere. Una ricerca su CPAN o con ppm può darti
ulteriori nomi e informazioni. Per HTML esistono analoghi moduli.
Ciao.