Perl est historiquement connu pour ses structures de données dynamiques : tableaux de longueur variable et tableaux associatifs (hachages). Depuis les premières versions du langage, ils permettent de modifier la taille (push/pop, shift/unshift pour les tableaux ; suppression/ajout de clés dans un hachage) à la volée. Cette flexibilité est intégrée dans l'architecture de Perl : la mémoire est gérée automatiquement, les conteneurs s'étendent ou se contractent sans intervention explicite du programmeur.
Le problème survient lors des modifications en masse : un ordre d'opérations non optimal peut conduire à une redistribution de mémoire inutile, et une manipulation erronée de la structure (par exemple, itération avec foreach tout en supprimant un élément) peut provoquer des bogues.
La solution consiste à utiliser des opérations en masse intégrées (splice, delete) ou à construire de nouvelles structures via map/grep, évitant les manipulations de la structure lors de sa traversée.
Exemple de code (suppression en masse selon une condition) :
# Supprimer les éléments avec des indices pairs du tableau my @arr = (1..10); @arr = grep { $_ % 2 } @arr; # Il ne restera que les impairs # Ajout en masse push @arr, (11, 13, 15); # Pour le hachage my %hash = (a => 1, b => 2, c => 3, d => 4); delete @hash{ grep { $hash{$_} % 2 == 0 } keys %hash }; # supprimons les valeurs paires
Caractéristiques clés :
Peut-on supprimer en toute sécurité des éléments d'un tableau lors d'une traversée for/foreach ?
Réponse : Non, cela entraînera un comportement incorrect — les indices se déplacent, le cycle "saute" des éléments. Utilisez le filtrage (map/grep) ou l'itération en ordre inverse avec splice.
Comment l'autovivification affecte-t-elle la création de nouvelles structures imbriquées ?
Réponse : Lorsqu'on accède à un élément inexistant, Perl crée la structure automatiquement, ce qui fait gagner du temps, mais peut entraîner des effets secondaires inattendus (création de structures "vides"). Contrôlez cela manuellement si une gestion stricte de la mémoire est nécessaire.
my %h; $h{newkey}{subkey} = 1; # Perl crée automatiquement un sous-hachage !
Réécrire une valeur existante dans un hachage est-il toujours un processus rapide ?
Réponse : Pour les scalaires et la plupart des types simples, oui ; cependant, si la valeur est une grande structure ou une référence, cela peut engendrer des coûts liés au comptage des références. Il est préférable de modifier de grandes structures sur place que de réécrire des références.
Le développeur supprime des éléments d'un tableau directement dans foreach, ce qui entraîne le fait qu'une partie des données reste dans le tableau, et la boucle fonctionne de manière incorrecte.
Avantages :
Inconvénients :
Utilisation de @arr = grep { condition } @arr pour le filtrage, ou suppression par indice effectuée à partir de la fin du tableau.
Avantages :
Inconvénients :