Блоки, которые помечаются большими буквами, в Perl 6 называются фейзерами (phasers). Вы знакомы с ними по Perl 5, например: BEGIN и END.
Сегодня мы рассмотрим два фейзера, которые выполняются при входе в подпрограмму и при выходе из нее: ENTER и LEAVE. В следующем примере это наглядно видно:
sub f() {
ENTER say 'Hi';
LEAVE say 'Bye';
say 'Body';
}
f;
Программа печатает такие строки:
Hi Body Bye
То есть сначала выполняется блок ENTER, затем тело функции и наконец блок LEAVE.
Порядок выполнения фейзеров не зависит от того, где они расположены. Например, все работает даже после return:
sub f() {
say 'Body';
return;
LEAVE say 'Bye';
ENTER say 'Hi';
}
При наличии более одного фейзера того же типа, блоки ENTER выполняются в порядке объявления, а LEAVE в противоположном:
sub f() {
say 'Body';
ENTER say 'Hi 1';
ENTER say 'Hi 2';
LEAVE say 'Bye 1';
LEAVE {
say 'Bye 2';
}
}
f;
(Здесь одновременно показан пример с блоком кода в одном из фейзеров.)
Программа печатает строки в следующем порядке:
Hi 1 Hi 2 Body Bye 2 Bye 1