ProgrammationDéveloppeur Backend

Comment fonctionnent les opérations de liste map et grep en Perl ? Quelles sont leurs différences et comment éviter des effets secondaires inattendus lors de leur utilisation ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

map et grep sont des fonctions puissantes en Perl pour travailler avec des tableaux :

  • map applique une expression à chaque élément de la liste et renvoie une nouvelle liste avec les résultats.
  • grep renvoie les éléments de la liste pour lesquels l'expression renvoie une valeur vraie (filtrage).

Exemple d'utilisation :

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)

Important

  • Portée : À l'intérieur des blocs 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).
  • Valeurs de retour : map renvoie toujours une liste, grep renvoie un sous-ensemble de la liste originale.

Question piège

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).

Exemple :

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

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet


Histoire Dans un projet, un développeur s'attendait à ce qu'après map { $_++ } @array, le tableau @array soit 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 map imbriqué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 le map interne a écrasé les valeurs dans le tableau de résultats.