map et grep sont des fonctions puissantes en Perl pour travailler avec des tableaux :
my @nums = (1, 2, 3, 4, 5, 6); my @squared = map { $_ * $_ } @nums; # (1, 4, 9, 16, 25, 36) my @even = grep { $_ % 2 == 0 } @nums; # (2, 4, 6)
map et grep, la variable $_ contient par défaut l'élément actuel. Modifier $_ changera l'élément même du tableau d'origine si le tableau est passé par référence ou si $_ est explicitement utilisé (par exemple, en alias avec foreach).map renvoie toujours une liste, grep renvoie un sous-ensemble de la liste originale.Question : Que fait le code suivant et pourquoi ?
my @nums = (1..5); my @result = map { $_++ } @nums; print "@nums ";
Réponse : Ce code ne modifiera pas le tableau d'origine @nums. L'opérateur $_++ augmente la valeur de la variable à l'intérieur du bloc, mais ne conserve pas ces modifications dans le tableau d'origine, car map renvoie la valeur modifiée, mais le tableau original n'est pas touché (à moins qu'un alias ne soit utilisé via foreach).
my @nums = (1..5); my @result = map { $_++ } @nums; # @result sera (1,2,3,4,5), @nums ne change pas print "@nums "; # Affichera : 1 2 3 4 5
Histoire Dans un projet, un développeur s'attendait à ce qu'après
map { $_++ } @array, le tableau@arraysoit modifié. Comme résultat, le programme continuait de fonctionner avec les anciennes valeurs, ce qui a conduit à des erreurs de comptage lors de l'agrégation des données.
Histoire Dans un système de reporting, lors du filtrage d'un tableau via
grep, on a accidentellement utilisé une commande d'affectation$result = $_à l'intérieur du bloc, ce qui a écrasé tous les éléments dans une même variable, perdant la source des données. Cela a compliqué le débogage et a conduit à des pertes dans le reporting.
Histoire Dans un script d'intégration, des
mapimbriqués ont été utilisés sans tenir compte que le contexte interne travaillait également avec la variable commune$_, ce qui a provoqué un comportement imprévisible lors de la modification des éléments, car lemapinterne a écrasé les valeurs dans le tableau de résultats.