Mettre un hash dynamique dans un hash ?

Le
ctobini
Bonjour,

J'aurais une petite question concernant les hash et comment inclure
dynamiquement un hash dans un hash.

Je souhaite faire un hash :

my %zero = ('x' => 0, 'y' => 0, 'z' => 0, my $hh => {});

Car x, y et z sont des valeurs que je retrouve systmatiquement dans
un fichier, en revanche je ne sais pas si l'attribution de $hh => {}
est correcte et comment faire ensuite la distinction entre x, y, z et
$hh dans :

traite($zero);

sub traite {
my(%hs) = @_;
foreach my $k (sort keys %hs) {
# si c'est x, y ou z crire
# si c'est un type hash (pour $hh donc) crire la taille du hash
avec scalar keys
}
}

En vous remerciant,

C. Tobini
Vos réponses
Trier par : date / pertinence
Paul Gaborit
Le #137204
À (at) 23 Jan 2007 02:49:53 -0800,
"ctobini"
J'aurais une petite question concernant les hash et comment inclure
dynamiquement un hash dans un hash.

Je souhaite faire un hash :

my %zero = ('x' => 0, 'y' => 0, 'z' => 0, my $hh => {});


Le 'my $hh' ici n'a pas de sens. D'ailleurs, cela passe-t-il à la
compilation ?

Car x, y et z sont des valeurs que je retrouve systématiquement dans
un fichier, en revanche je ne sais pas si l'attribution de $hh => {}
est correcte et comment faire ensuite la distinction entre x, y, z et
$hh dans :

traite($zero);

sub traite {
my(%hs) = @_;
foreach my $k (sort keys %hs) {
# si c'est x, y ou z écrire
# si c'est un type hash (pour $hh donc) écrire la taille du hash
avec scalar keys
}
}


Ce que vous cherchez, c'est la fonction 'ref'.

En supposant que %zero soit défini comme suit :

my %zero = (x => 0, 'y' => 1, z => 2, hh => {a => 1, b => 2});

(on est obligé de placé le 'y' entre apostrophes pour éviter la
confusion avec l'opérteur y///.)

Alors on peut faire :

foreach my $k (sort keys %zero) {
if (not ref($zero{$k})) {
print "$k => scalaire $zero{$k}n";
} elsif (ref($zero{$k}) eq 'HASH') {
print "$k => table de hachage ", scalar(keys %{$zero{$k}}), "n";
} else {
print "$k => autre type de réf. ", ref($zero{$k}), "n";
}
}

Pour en savoir plus : perldoc -f ref

PS: en général pour passer une table de hachage en paramètre d'une
fonction, on préfère éviter les recopies et passer une référence à
la table de hachage.

--
Paul Gaborit - Perl en français -
ctobini
Le #137087
Bonjour et merci de votre réponse,

Ca fonctionne parfaitement maintenant que le hash dynamique est sous la
forme %zero = ( x => 0 ... hh => {} ), j'avais également un soucis
avec son appel. Pour info ça compilait jusqu'à cette étape :-)
bizarre maintenant que j'ai saisi la logique.

Merci encore et bonne journée,

C. Tobini

On 23 jan, 14:03, Paul Gaborit
À (at) 23 Jan 2007 02:49:53 -0800,
"ctobini"
J'aurais une petite question concernant les hash et comment inclure
dynamiquement un hash dans un hash.

Je souhaite faire un hash :

my %zero = ('x' => 0, 'y' => 0, 'z' => 0, my $hh => {});Le 'm y $hh' ici n'a pas de sens. D'ailleurs, cela passe-t-il à la
compilation ?


Car x, y et z sont des valeurs que je retrouve systématiquement dans
un fichier, en revanche je ne sais pas si l'attribution de $hh => {}
est correcte et comment faire ensuite la distinction entre x, y, z et
$hh dans :

traite($zero);

sub traite {
my(%hs) = @_;
foreach my $k (sort keys %hs) {
# si c'est x, y ou z écrire
# si c'est un type hash (pour $hh donc) écrire la taille du hash
avec scalar keys
}
}Ce que vous cherchez, c'est la fonction 'ref'.


En supposant que %zero soit défini comme suit :

my %zero = (x => 0, 'y' => 1, z => 2, hh => {a => 1, b => 2});

(on est obligé de placé le 'y' entre apostrophes pour éviter la
confusion avec l'opérteur y///.)

Alors on peut faire :

foreach my $k (sort keys %zero) {
if (not ref($zero{$k})) {
print "$k => scalaire $zero{$k}n";
} elsif (ref($zero{$k}) eq 'HASH') {
print "$k => table de hachage ", scalar(keys %{$zero{$k}}), "n";
} else {
print "$k => autre type de réf. ", ref($zero{$k}), "n";
}

}Pour en savoir plus : perldoc -f ref

PS: en général pour passer une table de hachage en paramètre d'une
fonction, on préfère éviter les recopies et passer une référenc e à
la table de hachage.

--
Paul Gaborit - Perl en français -


Paul Gaborit
Le #137086
À (at) 24 Jan 2007 04:29:22 -0800,
"ctobini"
Ca fonctionne parfaitement maintenant que le hash dynamique est sous la
forme %zero = ( x => 0 ... hh => {} ), j'avais également un soucis
avec son appel. Pour info ça compilait jusqu'à cette étape :-)
bizarre maintenant que j'ai saisi la logique.


En fait, ça devait effectivement compiler... Mais si vous utilisiez
'warnings' et 'strict', vous deviez récupérer un avertissemenet. Un
message du genre :

Use of uninitialized value in list assignment at...

--
Paul Gaborit - Perl en français -
Publicité
Poster une réponse
Anonyme