Добрый вечер. Сегодня мы поговорим о простом ключевом слове 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 возвращает список из чередующихся ключей и значений хеша.
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[]"; }Вот это приятно. Не нужно городить кучу вложенных переборов.
3) for с Loop Phasers:
https://docs.perl6.org/language/phasers#Loop_Phasers
my @a = 1..Inf; for @a[^5] -> Int $i { FIRST { say 'Поехали!'; say '-' x 10 ; } say $i; NEXT { say '-' x 10 ; } LAST { say 'Полёт завершён!';} }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