Newsgroup: it.comp.lang.perl
Titolo: Come si fanno ad ordinare dei records?

Salve a tutti,
               ho un problema banale ma non so risolverlo in modo
pulito. Potreste rimandarmi a documentazione?
Vi espongo il problema. Ho una serie di eventi di cui ho il nome
ed una serie di date in cui avvengono questi avvenimenti p.e.
Concerto il 13/12/1999 - 15/2/2000 - 30/5/2001
Mostra il 15/11/1999 - 29/3/2000
Artigianato 12/12/1999
....
Devo ordinare i nomi degli avvenimenti in base alla prima data
di ciascun evento.
-- 
Ciao
     Marco Innocenti



Cosa c'era di poco chiaro nella risposta a questa FAQ che c'e nel manuale
(man perlfaq4). 
Oltretutto l'ordinamento dipende dalla struttura dati, non dai dati.
Maurizio
-- 
Maurizio M. Munafo' / 
mmmu...@netscape.net
"Consider Phlebas, who was once handsome and tall as you" (T.S.Eliot)

Oltretutto l'ordinamento dipende dalla struttura dati, non dai dati.
Il problema dipende dal fatto che sono piuttosto indietro con il perl.
Ho capito come si fa ad ordinare un array ma non ho capito come si fa
ad ordinare un array di record secondo il valore di un campo del record.
Non solo non ho capito come fare ma non ho capito neppure dove e' la
risposta a questa domanda all'interno del perlfaq4 che mi hai gentilmente
indicato.
-- 
Ciao
     Marco Innocenti

 indicato.
Esattamente al punto  "How do I sort an array by (anything)?"
Le FAQ di Perl andrebbero lette tutte, a prescindere dal fatto di aver
bisogno subito di quelle informazioni. Ti spiegano un mucchio di cose che
prima o poi ti servono.
Inoltre, finche' non avrai deciso come e' la struttura dati che vuoi usare
(e sopratutto non ce lo dici), non c'e' modo di dirti come fare il sort. Ci
sono diecimila modi diversi, probabilmente tutti sbagliati.
Tra l'altro 'un array di record secondo il valore di un campo del record'
non significa NULLA perche' in perl non esistono i record. Posso immaginare
cosa tu intenda veramente, ma solo immaginarlo.
Se vuoi aiuti concreti servono esempi concreti, con dati concreti, codice
concreto, output ottenuto e output desiderato.
Allora ti si puo' dire "dovresti fare cosi'". Se ti mantieni sul vago, trovo
perfettamente inutile spararti codice Perl a caso che potrebbe o meno
risolvere un problema simile al tuo.


cosa tu intenda veramente, ma solo immaginarlo.
Hai ragione di nuovo. Ho scritto array di record per spiegare quale e'
la logica del problema. Ho la piu' piena liberta' di implementazione
quindi posso fare come mi pare. Prima che nascesse l'esigenza
dell'ordinamento in questione tutto era rappresentato con vari array e
array di array.
$TITOLO[$i]
$TIPODATA[$i]
$PRIORITA[$i]
$TIPOLOGIA[$i]
$DAL[$i][$j]
$AL[$i][$j]
Ora penso di realizzare tutto questo con un un array di hashes di questo
tipo:
$EVENTO[4] = { TITOLO,"Arte in campagna",
               TIPODATA,1,
               PRIORITA,0,
 	       TIPOLOGIA,"Mostra",
	       DAL,["13/12/1999","24/4/2000","25/6/2000"],
               AL,["18/12/1999","24/5/2000","27/6/2000"],
	     } ;
 
Whoomp. Improvvisamente ho compreso tutto. Grazie mille.
Avevo letto il punto della faq che mi hai indicato piu' volte prima
di postare, dopo che me l'hai indicata l'ho letta altre volte ma la
mia mente si era sempre rifiutata di vedere alcune lettere.
Nella FAQ c'e' scritto:
@sorted = @data[ sort { $idx[$a] cmp $idx[$b] } 0 .. $#idx ];
ed io invece capivo:
@sorted = sort { $idx[$a] cmp $idx[$b] } 0 .. $#idx ;
e non cavavo un ragno da un buco.
Scusa per il tempo che ti ho fatto perdere.
-- 
Ciao
     Marco Innocenti

 Scusa per il tempo che ti ho fatto perdere.
Non e' mai tempo perso.
Con un array di hash del tipo da te indicato, se le date sono gia' ordinate
in $evento[$i]{DAL} e se hanno il formato da te usato, funziona
 @sorted = map { $_->[0] }
           sort { $a->[1] cmp $b->[1] }
	   map { [ $_ , sprintf "%04d%02d%02d", 
		  ($_->{DAL}[0] =~ m|(\d{1,2})/(\d{1,2})/(\d{4})|)[2,1,0] 
		 ] } 
           @evento;
