Newsgroup: it.comp.lang.perl
Titolo: stampa di array bi-dimensionale...

Ho un problema che mi blocca nella realizzazione di uno script...
A seguito di una query verso un DB MySql, ottengo in risposta nel
resultset una serie di linee del tipo:
PIPPO  mela
PIPPO  pera
PIPPO  mela
PLUTO  pera
PIPPO  mela
MARIO  uva
PLUTO  uva
.. ...
se mando il contenuto di ogni linea in un array bi-dimensionale del tipo:
$risultato[ $rs[0] ][ $rs[1] ],
e incremento ad ogni passaggio del ciclo l'array stesso con:
$risultato[ $rs[0] ][ $rs[1] ] += 1;
quello che dovrei/vorrei avere alla fine del ciclo è una cosa del tipo:
$risultato[PIPPO][mela] = 3;
$risultato[PIPPO][pera] = 1;
$risultato[PLUTO][pera] = 1;
$risultato[PLUTO][uva] = 1;
$risultato[MARIO][uva] = 1;
come faccio a stampare il tutto non conoscendo a priori cosa e quanto
contiene @risultato?
Se effettuo un
print @risultato;
ottengo una segnalazione del tipo:
ARRAY (0xafbbbc2)
sperando di essere stato in grado di far capire la cosa...
mi date una dritta?
grazie
---
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 resultset una serie di linee del tipo:
Vuoi usare delle stringhe come indice di un array?
Quello lo puoi fare con il PHP.
In perl una soluzione potrebbe essere quella di usare HASH, che hanno come
"indice" una stringa.
my %persone;
while (ciclo che prendere i valori da mysql) {
    $persone{$rs[0]}={} unless exists $persone{$rs[0]};
    $persone{$rs[0]}->{$rs[1]}++;
}
$persone{$rs[0]}={} unless exists $persone{$rs[0]};
Se l'indice $rs[0] non esiste nell'HASH, viene inserito come valore
l'indirizzo anonimo di un altro HASH.Facendo un paragone con i vettori,
possimo dire che inseriscei n quella cella un altro vettore.
$persone{$rs[0]}->{$rs[1]}++;
Viene incrementata e se l'indice $rs[1] non esiste viene creato ed
incrementato subito a valore 1.
Non mi so spiegare molto bene, magari trovo conferme in altri frequentatori
di questo NG.
Ciao


Alcune cose che puoi fare:
for my $riga (@risultato)
{
    for my $colonna (@$riga)
    {
        print "$colonna \t";
    }
    print "\n";
}
#oppure
for my $riga (@risultato)
{
    print map( {"$_\t"} @$riga), "\n";
}
# oppure, piu' semplicemente
print "@$_\n" for @risultato;
# o anche
print map {"@$_\n"} @risultato;
oppure dai un'occhiata a questo articolo, e vedi molte altre possibilita'.
http://gmax.oltrelinux.com/dbirecipes.html
Ciao
gmax
-- 
   ____ ____  _____ _   _
  / _  |    \(____ ( \ / )
( (_| | | | / ___ |) X (
  \___ |_|_|_\_____(_/ \_)
(_____|
MySQL Certified Professional
Sapere, saper fare, fare, far sapere
http://gmax.oltrelinux.com

>.<
Ho capito anche male >.<

possimo dire che inseriscei n quella cella un altro vettore.
Non riesco a capirne la necessità. Qual è il vantaggio, rispetto a fare
semplicemente e subito:
    $persone{$rs[0]}{$rs[1]}++;
La parte complicata è, semmai, tirarli fuori (che è poi quello che chiedeva
l'OP, a parte la confusione hash/array):
    for my $tizio (keys %risultato) {
        print $tizio, ": ";
        for my $frutto (keys %{$risultato{$tizio}})
           print $frutto, "=", $risultato{$tizio}{$frutto}, " ";
        }
        print "\n";
    }
Ciao.

     }
ho provato questo sistema ma non stampa nulla...
è tutto OK?


 
http://gmax.oltrelinux.com/dbirecipes.html
l'ho fatto ma, per me, è in alcune parti incomprensibile...
ho provato alcuni degli esempi ma non sempre funzionano.
ringrazio per la disponibilità
m.


chiedo venia...
ho ricontrollato bene e ho corretto un mio errore di battitura.
Ora funziona!
:-))
affettivamente avevo scambiato array con hash nel mio approccio.
Grazie Mille per l'aiuto.
m.
---


 praticamente: conoscere gli indici a cui i dati corrispondono
Quindi quello che ti serve non e' "stampa di un array bi-dimensionale"
ma "produzione di una tabella pivot.
Visto che ci ho scritto un articolo, ti consiglio di andare a vederlo:
http://www.onlamp.com/pub/a/onlamp/2003/12/04/crosstabs.html
In pratica, tu stai facendo nell'applicazione client quello che dovrebbe fare il server.
anziche' fare una query "SELECT persona, frutto from tabella" e poi contare a mano,
dovresti fare
SELECT
     persona,
     COUNT( case frutto = "pera" then 1 else null end ) as pera,
     COUNT( case frutto = "mela" then 1 else null end ) as mela,
     COUNT( case frutto = "uva" then 1 else null end  ) as uva,
     Count(*) as totale
FROM
     nometabella
GROUP BY
     persona
Il risultato ti viene dal database come lo vuoi tu.
