Функция map
не является циклом в Perl.Это хорошо видно по отказу next
, redo
и last
внутри map
:
perl -le '@a = map { next if $_ %2; } 1 .. 5; print for @a'
Can't "next" outside a loop block at -e line 1.
Чтобы достичь желаемого эффекта в map
, вы должны вернуть пустой список:
perl -le '@a = map { $_ %2 ? () : $_ } 1 .. 5; print for @a'
2
4
Я думаю, что преобразование - лучшее название для таких конструкций, как map
.Он превращает один список в другой.Функция, аналогичная map
, равна List::Util::reduce
, но вместо преобразования списка в другой список она преобразует список в скалярное значение.Используя преобразование слова, мы можем говорить об общих аспектах этих двух функций более высокого порядка.
Тем не менее, он работает, посещая каждого члена списка.Это означает, что он ведет себя очень похоже на цикл, и в зависимости от того, что вы определяете под «циклом», он может быть квалифицирован.Обратите внимание, мое определение означает, что в этом коде также нет цикла:
#!/usr/bin/perl
use strict;
use warnings;
my $i = 0;
FOO:
print "hello world!\n";
goto FOO unless ++$i == 5;
Perl фактически определяет слово loop в своей документации:
loop
A construct that performs something repeatedly, like a roller
coaster.
По этому определению map
является циклом, потому что он повторно преобразует свой блок;тем не менее, он также определяет «оператор управления циклом» и «метку цикла»:
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.
Я считаю, что называть map
цикл неточно, поскольку next
и его род определены как операторы управления циклами и они не могут контролировать map
.
Это все только игра слов.Описание map
как петли - это совершенно верный способ познакомить кого-то с этим.Даже документация для map
использует цикл foreach
как часть своего примера:
%hash = map { get_a_key_for($_) => $_ } @array;
is just a funny way to write
%hash = ();
foreach (@array) {
$hash{get_a_key_for($_)} = $_;
}
Хотя все зависит от контекста.Полезно описывать умножение для кого-то как повторяющееся сложение, когда вы пытаетесь заставить его или ее понять концепцию, но вы не хотели бы, чтобы он или она продолжали думать об этом таким образом.Вы бы хотели, чтобы он или она выучил правила умножения, а не всегда переводил обратно на правила сложения.