Pull to refresh

Perl6 — Условные операторы, циклы

Reading time 3 min
Views 7.2K
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) данная конструкция выдавала ошибку.
Tags:
Hubs:
+12
Comments 4
Comments Comments 4

Articles