Newsgroup: it.comp.lang.perl
Titolo: REQ: Generare piu' files da un elenco ASCII

Vi espongo il mio dilemma sperando nel vostro aiuto:
ho un file ASCII denominato spartiti.wri strutturato nel seguente modo
883;Come mai
883;Grazie mille
883;La regina
adamo;canzone1
adamo;canzone2
albano;canzone3
vorrei creare dei files separati del tipo
883.html
adamo.html
albano.html
ognuno contenente le rispettive canzoni
---
Lo script che ho buttato giu'
open (IN, "spartiti.wri");
 my ($artista,$titolo) = split(/;/);
 open (OUT, ">$artista.html");
 print OUT $intestazione;
 foreach (<IN>) {
 s/\n//;
 my ($artista,$titolo) = split(/;/);
 print OUT <<"FINE";
 <TR>
      <TD><p align="center"><b><font color="#003098">$artista
$titolo</font></b></p></TD>
 </TR>
 FINE
}
print OUT $finale;
close(OUT);
close(IN);
----
Ovviamente non funziona, tra l'altro $intestazione e $finale sono parti
standard della pagina che vanno scritte prima e dopo l'elenco delle canzoni.
Qualcuno puo' scrivermi lo script giusto, o indicarmi le sintassi da usare,
grazie a tutti.

 standard della pagina che vanno scritte prima e dopo l'elenco delle canzoni.
Di nuovo dico: non ce ne frega niente sapere che 'non funziona'!!!!
Un programma puo' 'non funzionare' in migliaia di modi piu' o meno creativi.
Se ci dici 'non crea il file di uscita' oppure 'crea solo un file chiamato
.html' o 'mi scrive ciccio-ciccio invece di quello che voglio io', allora
capiamo.
Maurizio
-- 
Maurizio M. Munafo' / 
mmmu...@netscape.net
"Consider Phlebas, who was once handsome and tall as you" (T.S.Eliot)

 capiamo.
Grazie per l'aiuto, usero' le tue istruzioni per imparare meglio questo
linguaggio,
tu impara ad essere un pochino piu' _delicato_     :-|
Ciao.

 cerchero` un'altra donna dentro ai sogni di Tarzan...

 sarebbe stato quasi dovuto).
Gli chiedo scusa, sono solo un po' suscettibile, cerca di capirmi... sono
all'inizio e puo' essere brutto incontrare modi bruschi, cosi' mi passa la
voglia di capire ^_^
Cmq seguendo le indicazioni ho scritto questo
open (IN, "lista.wri");
open (OUT, ">elenco.txt");
while (<IN>) {
 s/\n//;
 my ($artista,$titolo) = split(/;/);
 print OUT <<"FINE";
      $artista - $titolo
FINE
}
close(OUT);
close(IN);
Risultato (ovvio...):
analizzo lista.wri e genero un solo file di testo elenco.txt che contiene
883 - canzone1
883 - canzone2
883 - canzone3
albano - canzone1
albano - canzone2
La mia domanda e':
*Quali righe devo scrivere per generare files separati con dentro le canzoni
staccate per ogni artista* ?
Vorrei qualcosa del tipo:
883.txt che contiene
canzone1
canzone2
canzone3
albano.txt che contiene
canzone1
canzone2
Accetto anche gli insulti, ma aiutatemi grazie :-)))))))))

 canzone2
Il tuo problema di base, quindi, e` quello di accodare le canzoni. Per
farlo io userei degli hash, con chiave nome dell'autore:
<CODE>
use strict;
my($row,$key,$value,%SONGS);
local *FH;
open FH,'<lista.wri';
while ($row=<FH>) {
    next unless $row =~ /;/;    # per saltare righe vuote
    next if $row =~ /^\#/;      # per saltare le righe di commento
    ($key,$value) = split /;/,$row;
    $SONGS{$key} .= $value;
}
close FH;
foreach $key (keys %SONGS) {
    open FH,">$key\.txt";
    print FH $SONGS{$key};
    close FH;
}
</CODE>
Usando un hash array (%SONGS) hai un workaround per evitare il controllo
di esistenza della chiave per il setting e l'accodamento.
Non avendo fatto il chomp di $row viene riportato anche il \n in fondo.


 }
Dimenticavo: per semplicita` non ho testato l'esistenza del file prima
di crearlo, quindi questo script e` potenzialmente distruttivo.
Puoi ovviare scrivendo in una dir che sai essere vuota, o verificando
prima l'esistenza del file:
foreach $key (keys %SONGS) {
    next if -e "$key\.txt";
    open FH,">$key\.txt";
    print FH $SONGS{$key};
    close FH;
}
-- 


[snip]
Ti ringrazio per l'aiuto, lo provero' subito :)
Grazie ancora.