Une partie de votre problème est la confusion sur la façon dont map
fonctionne.
map
prend une liste d'arguments, effectue une opération sur les éléments de la liste et crée une nouvelle liste à partir des résultats. Dans un contexte scalaire, il renvoie le nombre de membres dans la nouvelle liste.
Dans la plupart des cas, vous ne souhaitez pas effectuer d'affectation dans l'opération map
.
# no assignment needed to set @foo
my @foo = map $_+2, 1,2,3;
# @foo = (3,4,5);
Le seul endroit où l'affectation logique est si vous avez besoin d'utiliser une opération qui devrait normalement changer la valeur de $_
, mais vous devez conserver les arguments à la carte sans changement.
Cette explication n'est pas très claire. Consultez ces exemples, ils devraient aider à clarifier ce que je dis. La première vous montre carte peut modifier les valeurs qu'il traite:
my @foo = qw(fee fie foe fum);
my @bar = map { s/e/-/g } @foo;
# @foo = ('f--', 'fi-', 'fo-', 'fum');
# @bar = (2, 1, 1, '');
Pour éviter de modifier @foo que vous pouvez faire:
my @foo = qw(fee fie foe fum);
my @bar = map { my $val = $_; $val =~ s/e/-/g } @foo;
# @foo = ('fee', 'fie', 'foe', 'fum');
# @bar = ('f--', 'fi-', 'fo-', 'fum');
Ou vous pouvez faire:
utilisation Liste :: moreutils QW (appliquer);
my @foo = qw(fee fie foe fum);
my @bar = apply { s/e/-/g } @foo;
# @foo = ('fee', 'fie', 'foe', 'fum');
# @bar = ('f--', 'fi-', 'fo-', 'fum');
à son plus map
de base fonctionne comme une forme spécialisée d'une boucle for
. Les deux morceaux de code produisent exactement le même résultat:
my @foo = map {$_ * 2} 1..5;
my @bar;
for (1..5) {
my $val = $_ * 2;
push @bar, $val;
}
J'espère que ce que vous avez donné un peu d'aide pour apprendre à penser à map
. Une fois que vous avez appris à l'utiliser (et les constructions connexes comme grep
et apply
), vous serez en mesure d'exprimer de manière concise des idées qui peuvent incroyablement verbeux lorsqu'il est construit en utilisant le code de bouclage normal.
daotoad, c'était la meilleure réponse que j'aurais pu obtenir pour ça. Je veux dire que tout le monde a été incroyablement utile mais votre réponse m'a vraiment aidé à le comprendre. – Nikki