L' map
fonction n'est pas une boucle en Perl. Cela peut être vu clairement par l'échec de l' next
, redo
, et last
à l'intérieur d'un map
:
perl -le '@a = map { next if $_ %2; } 1 .. 5; print for @a'
Can't "next" outside a loop block at -e line 1.
Pour atteindre l'effet souhaité en map
, vous devez renvoyer une liste vide:
perl -le '@a = map { $_ %2 ? () : $_ } 1 .. 5; print for @a'
2
4
Je pense que la transformation est meilleur nom pour des constructions comme map
. Il transforme une liste dans une autre. Une fonction similaire à l' map
est List::Util::reduce
, mais au lieu de transformer une liste dans une autre liste, il transforme une liste en une valeur scalaire. En utilisant le mot de transformation, nous pouvons parler des aspects communs de ces deux fonctions supérieures.
Cela dit, il fonctionne en visitant tous les membres de la liste. Cela signifie qu'il se comporte un peu comme une boucle, et selon ce que votre définition de la "boucle" est-ce que l'on pourrait qualifier. Remarque, ma définition signifie qu'il n'y a pas de boucle dans le présent code, soit:
#!/usr/bin/perl
use strict;
use warnings;
my $i = 0;
FOO:
print "hello world!\n";
goto FOO unless ++$i == 5;
Perl en fait de définir le mot de boucle dans sa documentation:
loop
A construct that performs something repeatedly, like a roller
coaster.
Par cette définition, map
est une boucle car il préformes son bloc à plusieurs reprises; toutefois, il définit également des "boucle de contrôle de l'instruction" et "boucle label":
loop control statement
Any statement within the body of a loop that can make a loop
prematurely stop looping or skip an "iteration". Generally you
shouldn't try this on roller coasters.
loop label
A kind of key or name attached to a loop (or roller coaster) so
that loop control statements can talk about which loop they want to
control.
Je crois qu'il est imprécis à l'appel map
une boucle car next
et ses comparses sont définis de la boucle de contrôle des déclarations et ils ne peuvent pas contrôler map
.
C'est tout simplement de jouer avec les mots mais. Décrivant map
comme-une-boucle est un bon moyen de présenter quelqu'un à elle. Même la documentation pour map
utilise un foreach
boucle dans le cadre de son exemple:
%hash = map { get_a_key_for($_) => $_ } @array;
is just a funny way to write
%hash = ();
foreach (@array) {
$hash{get_a_key_for($_)} = $_;
}
Tout dépend du contexte, si. Il est utile de décrire la multiplication à quelqu'un, comme on le répète outre, lorsque vous essayez de passer par lui pour comprendre le concept, mais vous ne voulez pas de continuer à penser de cette façon. Vous voulez lui apprendre les règles de la multiplication au lieu de toujours traduire retour aux règles de l'addition.