J'aurais une petite question concernant les hash et comment inclure
dynamiquement un hash dans un hash.
Je souhaite faire un hash :
my %zero =3D ('x' =3D> 0, 'y' =3D> 0, 'z' =3D> 0, my $hh =3D> {});
Car x, y et z sont des valeurs que je retrouve syst=E9matiquement dans
un fichier, en revanche je ne sais pas si l'attribution de $hh =3D> {}
est correcte et comment faire ensuite la distinction entre x, y, z et
$hh dans :
traite($zero);
sub traite {
my(%hs) =3D @_;
foreach my $k (sort keys %hs) {
# si c'est x, y ou z =E9crire
# si c'est un type hash (pour $hh donc) =E9crire la taille du hash
avec scalar keys
}
}
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Paul Gaborit
À (at) 23 Jan 2007 02:49:53 -0800, "ctobini" écrivait (wrote):
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.
À (at) 23 Jan 2007 02:49:53 -0800,
"ctobini" <ctemp2@free.fr> écrivait (wrote):
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 - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>
À (at) 23 Jan 2007 02:49:53 -0800, "ctobini" écrivait (wrote):
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.
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 wrote:
À (at) 23 Jan 2007 02:49:53 -0800, "ctobini" écrivait (wrote):
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.
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 <Paul.Gabo...@invalid.invalid> wrote:
À (at) 23 Jan 2007 02:49:53 -0800,
"ctobini" <cte...@free.fr> écrivait (wrote):
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 - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>
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 wrote:
À (at) 23 Jan 2007 02:49:53 -0800, "ctobini" écrivait (wrote):
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.
À (at) 24 Jan 2007 04:29:22 -0800, "ctobini" écrivait (wrote):
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...
À (at) 24 Jan 2007 04:29:22 -0800,
"ctobini" <ctemp2@free.fr> écrivait (wrote):
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 - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>
À (at) 24 Jan 2007 04:29:22 -0800, "ctobini" écrivait (wrote):
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...