7. Цикл for в Perl 6

Добрый вечер. Сегодня мы поговорим о простом ключевом слове for, которое в Perl 6 сильно преобразилось по сравнению с тем, как это было в Perl 5.

Самый простой вариант — взять массив и пройтись по нему:

my @a = < alpha beta gamma delta >;
for @a {
    say $_;
}

Более синтаксически выразительный вариант этого же цикла:

.say for @a;

Пока что в качестве переменной цикла работала переменная по умолчанию $_. Именованную переменную можно создать, используя стрелку:

for @a -> $x {
    say $x;
}

Обратите внимание, что my для создания переменной в этом случае не нужен.

Точно также можно ввести вторую переменную:

for @a -> $x, $y {
    say "$x $y";
}

Теперь на каждой итерации из массива будут читаться два значения, которые попадут в переменные $x и $y:

alpha beta
gamma delta

Это очень удобно использовать, например, для итерации по ключам и значениям хеша:

my %h = alpha => 'a', beta => 'b', 
        gamma => 'c', delta => 'd';

for %h.kv -> $greek, $latin {
    say "$greek=$latin";
}

Метод kv возвращает список из чередующихся ключей и значений хеша.

4 thoughts on “7. Цикл for в Perl 6”

  1. 1) for с проверкой типа:

    for 1..5 -> Int $i { say $i; }

    2) for с «распаковкой аргумента»:

    my @itemlist = (
        { book => {author => 'Пушкин А. С.', title => 'Сказка о попе и ...'}, count => 1, tags => qw|Поп Балда попадья черти| },
        { book => {author => 'Гоголь Н. В.', title => 'Ночь перед ...'}, count => 1, tags => qw|Вакула Солоха Дьяк Чёрт| },
    );
    
    for @itemlist -> % (:%book (Str:D :$title, Str:D :$author), Int :$count,
                        :@tags ($first-tag, *@other-tags))
    {
        say "$title, $author, $count, $first-tag, @other-tags[]";
    }
    
  2. 4) for с next, redo, last

    say '';
    my @q = 1,3...Inf;
    for @q {
        say $_;
        # You can...
        next if $_ == 3; # Skip to the next iteration (`continue` in C-like languages).
        redo if $_ == 4; # Re-do the iteration, keeping the same topic variable (`$_`).
        last if $_ > 5; # Or break out of a loop (like `break` in C-like languages).
    }
    

    5) for с read-write

    my @foo = 1..3;
    for @foo <-> $_ { $_++ }
    say @foo; # [2, 3, 4]
    

    6) for с default values

    my @list = 1, 2, 3, 4;
    for @list -> $a, $b = 'N/A', $c = 'N/A' {
        say "$a $b $c"
    }
    # 1 2 3
    # 4 N/A N/A
    

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *