1. Особенности работы с переменными и литералами в Perl6
2. Perl6 — Операции над переменными, анонимные блоки
В данной статье мы рассмотрим условные операторы и циклы, а также проведем несколько небольших экспериментов по их использованию.
Указанные выше операторы в Perl 6 обязательно должны получать блоки для выполнения: даже если необходимо выполнить только одно выражение, его необходимо передать внутри блока: { выражение; }
- Условные операторы
Один из условных операторов это if, его общий вид выглядит как:if (Условие) {Блок} elsif (ДругоеУсловие1) {Блок1} elsif (ДругоеУсловиеN) {БлокN} else {ЕщеОдинБлок}
Блок сохраненый в скалярной переменной передать нельзя, однако можно передать инструкцию о выполнении сохраненного блока:
{$block();}
Круглые скобки вокруг условия не обязательны.
Следующий условный оператор это unless: он выполняет Блок1 если условие1 является ложным, иначе выполняется ДругойБлокunless (условие1) {Блок1} else {ДругойБлок}
Однако есть конструкция, в которой возможно использование не блока, а единственного оператора:
действие if условие; действие unless условие;
Если для текущей задачи необходимо выполнить несколько простых действий и хочется записать их в похожем виде, то можно указать их с помощью конструкции
(действие1; действие2;) if условие;
Если написать следующую конструкцию
my $var = ( if ($i==0 { 1+1; } )
то в перменную $var будет занесено последнее вычисленное выражение, в данном случае если $i равна нулю, то вычисленным значением будет 2, если же $i не равно нулю, то вычисленным значением будет Nil (одноименного типа Nil)
Ещё один из видов условных операторов, это оператор выбора:given $value { when 'str1' {Блок1} when 40 {Блок2} when 'str1' {Блок3} default {БлокПоУмолчанию} }
После первого же успешного сравнения оператор given прекращает свою работу: это значит что Блок3 никогда не будет выполнен.
Сравнение идет в том порядке в котором указаны: если поставить после default какой либо when то до него сравнение никогда не дойдет, т.к. после default произойдет остановка выполнения оператора. - Циклы
Одним из операторов в данной группе является while: он выполняет указанный блок до тех пор, пока условие выполненяется$i = 0; while ($i<10) { $i++; }
Данный цикл переберет все значения от 0 до 10. Круглые скобки вокруг условия не обязательны.
Следующий оператор это until: он выполняет указанный блок до тех пор, пока условие не станет истинным:$i = 0; until ($i>=10) { $i++; }
Данный цикл сделает то же самое что и предидущий.
Так же как и с условием, возможна конструкцияsay $a++ while $a<10; ($a++; say $a) until $a>9;
Следующий оператор цикла имеет вид
loop (НачальныеУсловия; УсловиеОкончания; ИзменениеПеременныхЦикла) {Блок}
В блоке НачальныеУсловия задаются начальные значения переменных, в УсловиеОкончания указывается выражение которое будет определять, нужно ли начинать следующую итерацию цикла или нет, ИзменениеПеременныхЦикла содержит в себе выражения, которые будут выполняться в конце каждой итерации.
loop (my $i=0; $i<10; $i++) { say $i; }
loop (my ($i, $f) = (0,0); $i<10 && $f<5; $i++, $f++) { say $i, ' ', $f; }
loop (my $i=0; $i<10; ($i+=2; $i--)) { say $i; }
Оператор цикла for используется для перебора всех элементов массивов или списка переданного ему
for @mas, @mas2, 'string' 20, True -> $elemList {Блок}
При каждой итерации к элементу списка можно обратиться через переменную $elemOfMas, которая является псевдонимом этого элемента, однако изменять значения элементов списка через эту пееменную нельзя. Для того чтобы иметь возможность менять элементы списка необходимо вместо '->' использовать '<->'
Для всех операторов цикла можно применять операторы next (начать следующую итерацию), redo (Вернуться на следующую итерацию), last (Остановить выполнение цикла).
Имеется возможность запустить цикл с постусловием:repeat {Блок} while (Условие);
и
repeat {Блок} until ($x >= 10);
Так же в синопсах заявлено что можно будет написать конструкцию
repeat while (Условие) {Блок};
однако в последней версии (12.09) данная конструкция выдавала ошибку.
Автор: WarFair