En Perl, les structures de données simples sont des scalaires, des tableaux et des hachages auxquels nous accédons directement par leur nom. Les références sont des scalaires qui contiennent l'adresse d'autres structures de données. Elles sont nécessaires pour créer des tableaux imbriqués (multidimensionnels), des hachages imbriqués et des objets complexes.
Exemple d'utilisation des références :
my %hash = ( foo => 1, bar => 2 ); my $ref = \%hash; print $ref->{foo}; # 1 # Tableau de références à des hachages my @array = ( { name => "Tom" }, { name => "Jerry" } ); print $array[1]{name}; # Jerry
Sans utiliser de références, il est impossible de créer, par exemple, un tableau multidimensionnel :
# Tableau multidimensionnel via références my $matrix = [ [1,2,3], [4,5,6] ]; print $matrix->[1][2]; # 6
Cela permet de construire des structures de données complexes, de les transmettre efficacement entre les fonctions et d'implémenter des motifs de POO.
Peut-on accéder à un élément d'un tableau imbriqué (ou d'un hachage) sans utiliser de références ? Si oui, comment, et quand cela ne fonctionnera-t-il pas ?
On répond souvent que ce n'est pas possible, mais en réalité, Perl "convertit parfois" automatiquement les structures. Cependant, sans références, les structures d'imbrication ne fonctionneront pas lorsqu'elles sont créées à la volée ou lorsqu'elles sont passées comme arguments.
Exemple d'accès incorrect et correct :
# Ne fonctionnera pas de cette manière : my @arr = ( [1,2],[3,4] ); print $arr[0][1]; # 2 # Mais si on déclare non pas comme référence, mais juste un tableau, alors : my @matrix = ( [1,2], [3,4] ); print $matrix[1][0]; # 3
Histoire
Dans un grand projet, une référence à un tableau a été essayée d'être passée sans l'opérateur \, ce qui a conduit à ce que la structure interne "se déplie" comme un tableau de scalaires et a entraîné une rupture totale de la logique.
Histoire
Un développeur a mélangé l'accès par référence et sans référence dans le code, entraînant la perte de certaines données lors des boucles imbriquées foreach avec un tableau de références.
Histoire
Lors de la manipulation d'un fichier de configuration, imbriqué via un hachage de références, on a oublié de déréférencer la référence et on a accédé comme à un hachage, ce qui a provoqué une erreur d'exécution "Can't use string ("HASH(0x1234)") as a HASH" en production.