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

    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) данная конструкция выдавала ошибку.

    Similar posts

    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 4

      0
      Имхо за

      (действие1; действие2;) if условие;

      и

      ($a++; say $a) until $a>9;

      надо бить по рукам и не только в Перле :)
        +4
        О, прибежали минусяторы, которые не разгребали видимо чужой перл-код :) Хвостовые условия хороши только при коротких действиях типа:

        die if $error;

        Длинное выражение, а уж тем более список выражений перед постусловием — зло.
          0
          Я согласен что стоит бить, но не всегда, ибо такое выражение бывает оправдано, если например необходимо выполнить подряд всего лишь две функции, или что нибудь на подобии этого. Да хотяб
          (PrintLogToFile; die) if $condition;

          P.S. я бы плюсанул коммент, да вот нет у меня столько кармы )
            0
            Эту картошку не хочешь ты…

          Only users with full accounts can post comments. Log in, please.