Функция 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
I Думайте, трансформация - лучшее название для конструкций вроде 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 фактически делает define the word 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
и его родня определяются как loop control statements и они не могут контролировать 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($_)} = $_;
}
Это все зависит от контекста, хотя. Полезно описать умножение на кого-то как повторное дополнение, когда вы пытаетесь заставить его или ее понять концепцию, но вы не хотите, чтобы он или она продолжали думать об этом таким образом. Вы хотели бы, чтобы он или она изучали правила умножения, а не всегда возвращались к правилам добавления.
Кстати, это, безусловно, может быть потому, что я смотрел на неправильные списках петель, и в ответ я бы с удовольствием принимаю какое-то официальный список петли, которые на самом деле включает в себя «карту» – DVK
«Loop» не имеет точного универсального определения, поэтому это строго семантика: ответ заключается в том, что 'map' является циклом тогда и только тогда, когда кто-то, кого вы признаете авторитетным (например, Ларри Уолл, или консенсус Perl сообщество) говорит, что это так. –
@j_random - Это то, что я имел в виду ... кто-то предоставлял некоторые «официальные» формулировки (например, скажем, из книги О'Рейли или perlfaq или perldoc), или ответ от кого-то, глубоко связанного с внутренними элементами Perl (IIRC Larry Wall не входит в /. но Рэндал Шварц и несколько перлов-носильщиков) – DVK