- PVSM.RU - https://www.pvsm.ru -
1. Особенности работы с переменными и литералами в Perl6 [1]
2. Perl6 — Операции над переменными, анонимные блоки [2]
3. Perl6 — Условные операторы, циклы [3]
4. Perl6 — Работа с функциями [4]
5. Perl6 — Классы [5]
6. Perl6 — Ввод-вывод, модули [6]
7. Perl6 — Комментарии, пробельные символы, скобки [7]
8. Perl6 — Перегрузка операторов [8]
9. Perl6 — Работа с типами данных [9]
10. Perl6 — Обработка исключений [10]
В прошлой статье мы говорили об отлове исключений, что происходило в специальном вложенном блоке CATCH. На самом деле этот блок является особой разновидностью — Phasers (я просто не могу перевести это слово). Phasers — это специальные вложенные блоки, которые выполняются при определенных условиях. С чем же их готовить увидите под катом.
Рассмотрим основных представителей Phaser'ов:
say "Test say";
my $block = BEGIN {
say "Compile say";
"Compile time " ~ now;
}
say $block;
В данном случае переменной блок будет присваиваться строка отражающая время компиляции (Причем как я понял сам блок выполняется при компиляции, а при выполнении скрипта переменной присваивается уже вычисленного значения).
В результате мы увидим на экране:
Compile say
Test say
Compile time Instant:1377026323.088
Причем, если внутри блока BEGIN произойдет исклчение:
say "Test say";
my $block = BEGIN {
die "Compile die";
"Compile time " ~ now;
}
say $block;
То на экране мы уже не увидим надписи «Test say», а сразу «Compile die», хотя вывод и происходит раньше чем присвоение результата выполнения блока BEGIN.
Ну и последний пример по этому блоку, чтобы развеять возможные сомнения:
say "Test say";
BEGIN {
say "Compile say";
}
say "Test say 2";
BEGIN {
say "Compile say 2";
}
В результате мы увидим на экране:
Compile say
Compile say 2
Test say
Test say 2
say "Test say";
BEGIN {
say "Compile say";
}
CHECK {
say "Check say";
}
say "Test say 2";
BEGIN {
say "Compile say 2";
}
CHECK {
say "Check say 2";
}
В результате мы увидим на экране:
Compile say
Compile say 2
Check say 2
Check say
Test say
Test say 2
say "Test say";
BEGIN {
say "Compile say";
}
CHECK {
say "Check say";
}
INIT {
say "Init say";
}
say "Test say 2";
BEGIN {
say "Compile say 2";
}
CHECK {
say "Check say 2";
}
INIT {
say "Init say 2";
}
В результате вывод следующий:
Compile say
Compile say 2
Check say 2
Check say
Init say
Init say 2
Test say
Test say 2
say "Test say";
BEGIN {
say "Compile say";
}
CHECK {
say "Check say";
}
INIT {
say "Init say";
}
END {
say "End say";
}
say "Test say 2";
BEGIN {
say "Compile say 2";
}
CHECK {
say "Check say 2";
}
INIT {
say "Init say 2";
}
END {
say "End say 2";
}
die "test die";
В результате видим на экране:
Compile say
Compile say 2
Check say 2
Check say
Init say
Init say 2
Test say
Test say 2
test die
in block at blablablaperl.p6:37
End say 2
End say
loop (my $i=0; $i <4; $i++)
{
ENTER {
say $i;
}
say "Another loop entry";
}
ENTER {
say "Test Enter";
}
Вывод данного скрипта:
Test Enter
0
Another loop entry
1
Another loop entry
2
Another loop entry
3
Another loop entry
Стоит также отметить то, что можно блоки Phasers вкладывать друг в друга.
loop (my $i=0; $i <4; $i++)
{
LEAVE {
say "Test leave";
}
say "Another loop entry";
}
Если вдруг кто-нибудь сможет это скомпилировать, поведайте пожалуйста в комментариях.
Как в дальнейшем я выяснил, не работает часть, связанная с выходом из блока. Но перейдем дальше:
loop (my $i=0; $i <4; $i++)
{
FIRST {say "Test keep";}
say "Another loop entry";
}
Соответственно вывод:
Test keep
Another loop entry
Another loop entry
Another loop entry
Another loop entry
Так же в отдельный список выведены операторы, которые действуют подобно Phaser'ам, которые пишутся в нижнем регистре:
if ( do {my $a = 10; $a = $a*2;} == 20)
{
say "It's ok";
}
Таким образом мы вложили вычисление внутрь блока if, а сам блок do можно будет использовать потом для сравнения. Пример конечно очень плохой для ваших пальцев (можно и линейкой схлопотать по ним за такое), но для того чтобы показать для чего он может быть использован пример сгодится.
my $i = once {
say "Test once";
};
$i();
$i();
$i();
Жалуется на то, что не смог найти функцию &once.
Чтож, пожалуй пора заканчивать. Как-то даже длинновай пост получился из-за примеров, но надеюсь вам понравилось.
Автор: WarFair
Источник [11]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/41368
Ссылки в тексте:
[1] 1. Особенности работы с переменными и литералами в Perl6: http://habrahabr.ru/post/152403/
[2] 2. Perl6 — Операции над переменными, анонимные блоки: http://habrahabr.ru/post/153875/
[3] 3. Perl6 — Условные операторы, циклы: http://habrahabr.ru/post/154701/
[4] 4. Perl6 — Работа с функциями: http://habrahabr.ru/post/154997/
[5] 5. Perl6 — Классы: http://habrahabr.ru/post/155571/
[6] 6. Perl6 — Ввод-вывод, модули: http://habrahabr.ru/post/161989/
[7] 7. Perl6 — Комментарии, пробельные символы, скобки: http://habrahabr.ru/post/190114/
[8] 8. Perl6 — Перегрузка операторов: http://habrahabr.ru/post/190186/
[9] 9. Perl6 — Работа с типами данных: http://habrahabr.ru/post/190266/
[10] 10. Perl6 — Обработка исключений: http://habrahabr.ru/post/190406/
[11] Источник: http://habrahabr.ru/post/190778/
Нажмите здесь для печати.