Блоки, которые помечаются большими буквами, в 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