Newsgroup: it.comp.lang.perl
Titolo: Stampa da una hash di liste

Ciao a tutti,
Questo è il codice:
|#!/usr/bin/perl
|use warnings;
|use strict;
|
|my %hash = (
|       disney => ( [ "pippo", "pluto", "paperino" ] ),
|	frutta => ( [ "mela", "pera", "banana" ] )
|	);
|
|( print( $_, "\t", $hash{$_}, "\n") ) foreach (keys %hash);
L'output è il seguente:
frutta  ARRAY(0x81768ac)
disney  ARRAY(0x815dc10)
Mentre mi aspettavo di vedere stampate le mie liste. Dove sbaglio?
ciao
Luca

 |( print( $_, "\t", $hash{$_}, "\n") ) foreach (keys %hash);
Ok, trovato, cosi' stampa la lista:
|( print( $_, "\t", @{$hash{$_}}, "\n") ) foreach (keys %hash);
ma cosi'...
|frutta  melaperabanana
|disney  pippoplutopaperino
c'e' modo di formattare la stampa della lista?
ciao
 
Luca



mi sa che data::dumper è quello che stai cercando...
--
Non preoccuparti di venire nell' UK e soffrire di nostalgia..
Gli ospedali inglesi e la British Telecom ti faranno sentire a casa.
http://www.pigmalion.info/

Gli ospedali inglesi e la British Telecom ti faranno sentire a casa.
... mi è tornata alla mente la volta in cui mi sono ustionato una mano a
Brighton. Era mezzanotte. Sono fino alle sei del mattino nella sala
d'aspetto del pronto soccorso. Quando finalemente sono riuscito a farmi
visitare il medico mi ha guardato la mano e mi ha detto: "Non è grave,
guarirà da sola, e poi tu non paghi le tasse, quindi...". :-O
ciao
Luca

Non e` tra le sintassi + eleganti, ma l'idea e` questa:
...
foreach (keys %hash) {
     print $_;
     while (@{$hash{$_}}) {
         ( print( "\t", shift @{$hash{$_}}, "\n") );
     }
}
...


 c'e' modo di formattare la stampa della lista?
Quando metti un array tra doppie virgolette, il suo valore
viene interpolato nella stringa usando $" come separatore.
Il valore di default di $" e` lo spazio. Ad esempio:
  perl -e '@a = qw/mela pera banana/; print "@a"'
Puoi modificare temporaneamente il valore di $" per ottenere
l'effetto che desideri:
  @a = qw/mela pera banana/;
  {
      local $" = "\t";
      print "@a";  # Qui usa i tab
  }
  print "@a"; # Qui usa gli spazi, poiche` $" torna 
              # a valere " "
Alternativamente puoi usare la funzione join:
  perl -e '@a = qw/mela pera banana/; print join " ", @a'
ciao,
S.

 Non e` tra le sintassi + eleganti, ma l'idea e` questa:
Nel frattempo mi sono reso conto che nel mio caso specifico è piu' comodo
un hash di hash che un hash di liste :)
grazie lo stesso
ciao
Luca

|( print( $_, "\t", $hash{$_}, "\n") ) foreach (keys %hash);
Non capisco questo amore sviscerato per le parentesi. Un solo livello di
parentesi basta e, talvolta, avanza:
   my %hash = (
        disney => [ "pippo", "pluto", "paperino" ],
        frutta => [ "mela", "pera", "banana" ]
        );
    foreach (keys %hash) {
        print  $_, "\t", join(', ', @{$hash{$_}}), "\n";
    }
Ciao.


Oltre che non essere "elegante" (qualsiasi cosa questo voglia dire),
modifica il contenuto di %hash, e non siamo autorizzati a pensare che sia
irrilevante.
Senza nessuna pretesa estetica, ma con un atteggiamento un po' più
conservativo, e meno parentesi:
        foreach (keys %hash) {
             print $_;
             for my $elemento (@{$hash{$_}}) {
                 print "\t", $elemento, "\n";
             }
        }
Ciao.

 writes:
lcua> On Tue, 02 Mar 2004 10:17:06 +0100, Seba wrote:
lcua> > Non e` tra le sintassi + eleganti, ma l'idea e` questa:
lcua> Nel frattempo mi sono reso conto che nel mio caso specifico è
lcua> piu' comodo un hash di hash che un hash di liste :)
se tu sapessi le implicazioni di un hash di liste e hash di hash
potresti avanzare considerazioni come la precedente, invece pare
proprio scritta per dire
lcua> grazie lo stesso
gli hash sono strutture dati concettualmente diverse dagli array,
costano di piu` e si usano quando c'e` bisogno di associare a delle stringhe
qualsiasi cosa. (questa semplice caratteristica e` un punto di partenza
nella strutturazione dei dati). --MARco
"rendersi conto che e` piu` comodo cambiare struttura dati"
e` francamente mooolto stupido.
suvvia, leggi almeno  man perlref
lcua> ciao
lcua> Luca
[hai due lettere invertite nella configurazione del tuo client NNTP/usenet]
Saluti,
MARco
-- 
x(t),y(t) = th(3t-34.5)*e^[-(3t-34.5)^2]/2-4.3+e^(-1.8/t^2)/(.8*atg(t-
3)+2)(t-1.8)-.3th(5t-42.5),(1.4e^[-(3t-34.5)^2]+1-sgn[|t-8.5|-.5]*1.5*
|sin(pi*t)|^[2e^(-(t-11.5)^2)+.5+e^(-(.6t-3.3)^2)])/(.5+t)+1  ; 0<t<14

 parentesi basta e, talvolta, avanza:
Lo so, è piu' forte di me :)
ciao
Luca

 NNTP/usenet]
E' intenzionale. Dato che spesso scrivendo veloce mi capita di invertire
le due lettere lo ho scelto come nick :)
ciao e grazie
Luca