Всем привет, это снова я и Perl 6.

Вообще-то, изначально в планы входили по две публикации в неделю, но, очень скоро я вдруг осознал, что материала набегает на 9 глав, и месячник Perl 6 может затянуться на двумесячник. Не хотелось бы.

Поэтому снова здесь ликбез по Perl 6, продолжение искрометной первой и удивляющей второй главы, пятничная-последняя-статья-про-перл-на-этой-неделе-обещаю.

Новая глава называется «Циклы».

for
В Perl 6 цикл for нужен для тех типов данных, которые могут использовать итератор. По умолчанию, значение переменной помещается в $_. Следующий пример иллюстрирует вывод всех элементов массива @scores:

my @scores = <52 95 78>;
for @scores {
say $_;
}

Есть еще одна любопытная особенность цикла for — можно указывать действие перед самой инструкцией for:

.say for @scores;

Все, что находится внутри фигурных скобок { ... } называется лексическим блоком. В perl 6 лексические блоки могут получать параметры с помощью такой конструкции: ->.

my @scores = <52 95 78>;
for @scores -> $score {
say $score;
}

В этом примере у нас есть именованный параметр, сохраняющий результат итерации массива. По умолчанию, иакме переменные доступны только для чтения. Внутри цикла их изменять нельзя. Исправить эту ситуацию возможно с помощью «ключевого слова» is rw:

for @scores -> $score is rw {
say ++$score;
}

Можно передавать несколько параметров в блок:

for @scores -> $score is rw, $value {
say ++$score, " and ", $value;
}

Если есть необходимость сделать все параметры изменяемыми, т.е., is rw, то легко можно воспользоваться двунаправленной стрелкой: <->, она как раз и будет означать, что все параметры в блоке можно изменять:

for @scores <-> $score, $value {
say ++$score, " and ", ++$value;
}

Метод .kv возвращает список ключа и значения хеша попарно в виде списка. Блок может принимать несколько параметров, поэтому мы можем пробегать по ключам и значениям хеша таким образом:

my %ages = (Fred => 45, Bob => 33);
for %ages.kv -> $name, $age {
say "$name is $age years old";
}

Цикл loop
По сути, это переименованный цикл for из Perl 5, имеющий синтаксис языка C:

loop (my $i = 1; $i <= 42; $i++) {
say $i;
}

Да, теперь цикл for с таким синтаксисом не существует.

Просто одно слово loop, без дополнительных параметров, порождает бесконечный цикл:

loop {
my $cur_pos = get_position();
update_trajectory($target, $cur_pos);
}

while и until
Эти циклы в Perl 6 не изменились. Почти. Теперь можно опускать скобки вокруг выражений, что, в общем-то, справедливо для всех конструкций языка.

while $bar < 100 {
...
}

При необходимости, вы можете сохранить результат выражения внутри параметра и передать его в блок:

while something() -> $thing {
...
}

repeat
Этот цикл с пост-условием, которые могут быть взаимоземеняемыми:

repeat {
...
} while $x < 10;

совершенно аналогично этому:

repeat {
...
} until $x >= 10;

Если вас смущает присутствие until или while после блока цикла, то специально для таких, как вы, в Perl 6 есть заменяющая конструкция:

repeat while $x < 10 {
...
}

Конечно, работает и с until.

shootnix
shootnix
07 августа 2009, 13:43
 13  
просмотров
1051
9
 
shootnix
07 августа 2009, 14:21
0
Хорошо бы узнать, за что товарищи минусуют? Что плохо?
resurtm
07 августа 2009, 14:23
0
Школота отакуэ ювижн. Плюсанул.
shootnix
07 августа 2009, 14:24
0
Спасибо =)))
chiaroscuro
07 августа 2009, 14:42
0
Угу, тоже плюсанул.
shootnix
07 августа 2009, 14:57
0
Угу, тоже спасибо =)))
Werser
07 августа 2009, 15:14
0
На здоровье.
Baidaly
10 августа 2009, 15:43
0
+1))
chiaroscuro
07 августа 2009, 14:28
0
Какое-то синтаксическое сумасбродство этот ваш Перл. :)

Резюме статьи: лямбда-выражения (aka лексические блоки) + функция высшего порядка for.

В Haskell:

> map (x -> x + 1) [1,2,3,4]

(вернет [2,3,4,5])

> mapM print [1,2,3,4,5]

(распечатает список элементов по одному)

И короче, и понятнее, и единообразно (одни правила на весь язык, никаких "особых случаев").
shootnix
07 августа 2009, 14:34
1
Ну понятное дело, Хаскель — функциональный язык, а Perl — мультипарадигменный, в нем есть возможность писать так, как хочется. Основной лозунг Perl был во все времена известен — «Есть несколько способов сделать это». И это не «особые случаи», это просто «как ты хочешь».

В Perl тоже есть map:

map { "Hello, $_!" } @names;
(Выведет приветствия всем элементам списка)
shootnix
07 августа 2009, 14:35
0
> Какое-то синтаксическое сумасбродство этот ваш Перл. :)
Это я еще не все показал =))) Дальше будет еще веселее ;-)
neon
10 августа 2009, 13:44
0
Даешь php !!! xD
shootnix
10 августа 2009, 13:46
0
Еще один... =)
Baidaly
10 августа 2009, 15:43
0
Пиши еще, такого контента должно быть больше!!!
Чтобы оставлять комментарии, Вы должны быть авторизованы. Если у Вас нет логина, то пройдите регистрацию.
участники
shootnix
Rex
edmond-mouse
mikusya
Legend_FoX
PeterWilson
askhattk
barmaglot
wwax
tima888
t-sh
Sigurt
zloyrusskiy
goodev
10275
PILIGRIM
войти
зарегистрироваться
сообщества
последние записи
записи по обсуждениям
записи по рейтингу
создать новое сообщество
личные блоги
последние записи
записи по обсуждениям
люди
самые активные
новые
по городам
по интересам
блог проекта
правила участия
помощь
мы на других сайтах
реклама
конкурсы
контакты
WebEverywhere, 2008-2010

Lyakhov.KZ - Большая энциклопедия Казнета Lyakhov.KZ - Большая энциклопедия Казнета