Historique de la question :
Depuis le début de son développement, Perl a accordé une grande importance au travail avec des tableaux et des listes de données. Des fonctions comme map, grep et l'opérateur de boucle foreach permettent aux programmeurs de traiter de manière concise et efficace des collections, réalisant des motifs puissants de programmation fonctionnelle dans une seule expression.
Problème :
De nombreux programmeurs Perl débutants confondent quand utiliser map, foreach ou grep, ce qui conduit à un choix d'outil inapproprié et à une diminution de la performance ou de la lisibilité du code. De plus, l’inattention aux effets secondaires dans le corps de telles expressions entraîne des erreurs difficiles à déboguer.
Solution :
Le choix correct de l’outil de parcours des données dépend de la tâche :
map — est utilisé pour transformer les éléments d'une liste et construire une nouvelle liste de résultats.grep — filtre les éléments de la liste source selon un critère donné.foreach — est utilisé pour des effets secondaires и une traitement cyclique, souvent sans valeur de retour.Exemple de code :
my @numbers = (1, 2, 3, 4, 5); my @squares = map { $_ * $_ } @numbers; # [1, 4, 9, 16, 25] my @even = grep { $_ % 2 == 0 } @numbers; # [2, 4] foreach my $n (@numbers) { print "Number: $n "; # affiche chaque élément }
Caractéristiques clés :
map et grep fonctionnent dans un contexte de liste et retournent une nouvelle liste.foreach ne crée pas de nouvelle liste, mais parcourt simplement les éléments.map ou grep ne sont pas recommandés.Est-il sûr de modifier un tableau à l'intérieur du corps de map ou grep ?
Non, car Perl parcourt une liste de copies des éléments, mais la modification du tableau d'origine peut entraîner des résultats inattendus ou même une boucle infinie.
Que se passe-t-il si return est utilisé dans le corps de map ou grep ?
L’expression return à l’intérieur d’un bloc anonyme entraînera la sortie de la sous-programme environnante, et non seulement du corps de map/grep, ce qui est dangereux pour la logique du programme.
Exemple de code :
sub example { my @data = (1, 2, 0, 4); my @result = map { return "oops" if $_ == 0; $_+1 } @data; # sortira de example à 0 }
Pourquoi ne pas utiliser map uniquement pour les effets secondaires ?
Parce que map est destiné à générer de nouvelles listes, et tous ses éléments sont évalués immédiatement. Pour des effets secondaires, il est plus optimal d'utiliser foreach — c'est plus lisible et ne nécessite pas de stockage du résultat.
Dans un projet, map était utilisé pour écrire dans un journal, sans se soucier de la liste retournée.
Avantages :
Inconvénients :
Utilisation de foreach pour écrire dans un journal, et map uniquement pour générer de nouvelles listes, sans mélanger les motifs.
Avantages :
Inconvénients :