En Perl, le résultat d'une assignation (et, par conséquent, du travail avec des tableaux et des hachages) dépend du contexte.
my @arr = (10, 20, 30); my $count = @arr; # $count == 3 my ($first, $second) = @arr; # $first == 10, $second == 20
Pour les hachages :
my %h = (a=>1, b=>2, c=>3); my $size = %h; # $size == 3 dans les versions modernes de Perl, mais ce n'était pas le cas avant !
Faites attention à assigner une référence de tableau au lieu de copier son contenu !
Quelle est la différence entre assigner un tableau à une référence et copier le contenu d'un tableau ?
Réponse :
my @a = (1,2,3); my $ref = \@a; # $ref est une référence au tableau, les modifications via $ref sont visibles dans @a my @b = @a; # @b est un nouveau tableau, les modifications de @b n'ont aucun effet sur @a # Comparez : push @$ref, 4; # @a est maintenant (1,2,3,4) push @b, 5; # @a reste (1,2,3,4); @b est (1,2,3,5)
Histoire 1
Dans un projet, un tableau était passé à une sous-programme par référence, sans comprendre qu'il s'agissait d'une référence : la fonction le modifiait au moment de l'appel. Des bugs sont apparus — dans le code appelant, la structure des données était déjà "endommagée". On s'attendait à une copie, on a reçu un alias.
Histoire 2
Un ingénieur pensait que l'assignation scalaire de
%hrenverrait le nombre réel de paires. En réalité, dans les anciennes versions de Perl, ce comportement était différent : on renvoyait le nombre de slots/bacs, et non la longueur ! Au final, cela renvoyait parfois un nombre autre que 3, ce qui a cassé les statistiques.
Histoire 3
Dans un grand système ETL, les tableaux étaient copiés par références, puis se sont retrouvés à écraser les données les uns des autres, car tout le monde travaillait avec le même tableau, et non avec des copies indépendantes. Le diagnostic de l'erreur a pris plusieurs jours.