Dans un tableau ou un hash, on ne peut mettre que des scalaires. Autrement dit on ne peut pas y mettre un tableau ou un hash comme tu essaies de le faire ici (ça ne plantera pas, mais ça ne fera pas ce que tu veux). On peut mettre un nombre, une chaîne de caractère ou une référence. La référence peut pointer sur un tableau ou un hash, et c'est ainsi qu'on construit des structures de données complexes.
push @{$ref_cr_fs->{$filesys{VGNAME}}} , %filesys ;
Cette ligne rajoute l'ensemble des éléments de %filesys à @{$ref_cr_fs->{$filesys{VGNAME}}} dans un ordre quelconque (mais avec chaque clé suivie de sa valeur) par exemple s'il y a (hello => "world", bye => "all") dans %filesys, les éléments 'bye', 'all', 'hello' et 'world' pourrait être ajouté dans cet ordre à la fin du tableau @{$ref_cr_fs->{$filesys{VGNAME}}.
On dit que %filesys est "aplati" (flattened) en contexte de liste.
push @{$ref_cr_fs->{$filesys{VGNAME}}} , { %filesys } ;
Ici, les { } construisent une nouvelle référence anonyme vers un hash dont le contenu est copié depuis %filesys.
Attention la syntaxe suivante peut poser problème :
push @{$ref_cr_fs->{$filesys{VGNAME}}} , \%filesys ;
Ici on prend directement une référence au hash %filesys. Celui-ci étant déclaré (de façon incorrecte à mon avis) en dehors de la boucle, son contenu est changé à chaque boucle, et à la fin de la boucle, notre tableau ne comportera que des références vers l'actuel %filesys, autrement dit il aura les mêmes valeurs dans toutes ses cases, les dernières à avoir été entrées dans %filesys.....
Pour éviter cela, il est préférable de toujours utiliser la première syntaxe avec les {}, ou de déclarer la variable dont on prend la référence dans la boucle où on la prend (de façon à ce qu'une nouvelle variable soit créée à chaque itération).
--
Jedaï
Partager