В серверном коде, обслуживащем сайт, блоки given/when весьма удобны в частности для того, чтобы последовательно протестировать URL запрошенного ресурса и выполнить соответствующие действия:
given($url) {
when(m{^/$}) {home_page()}
when(m{^/about/$} {about_page()}
. . .
}
В Perl 5.10 помимо операторов given/when доступны именованные сохраняющие скобки, которые могут облегчить выделение параметров из адреса одновременно с его разбором:
given($url) {
. . .
when(m{^/news/(?<year>\d+)/(?<month>\d+)/(?<day>)/$})
{news_that_day()}
}
Параметры, захваченные именованными скобками, попадают в хеши %+ и %-, которые следует передать дальше на обработку.
Однако, в зависимости от общей архитектуры (в нашем примере — схемы разбора URL) может проявиться ограниченность области видимости, в которой доступны упомянутые хеши. То есть сразу после закрывающей скобки, завершающей блок given, сохраненные значения перестают быть доступными.
given($url) {
. . .
}
say Dumper(\%+); # Пусто
В этом месте кода переменные %+ и %- сохраняют значения, полученные до начала блока given.
Вплоне логично, хорошо локализовано, но не всегда удобно.
Разумеется, возможно сохранить собранные данные непосредственно в блоке given, хотя при легкомысленном проектировании это легко приводит к большим фрагментам повторяющегося кода:
given($url) {
. . .
when(m{^/(?<type>this)_page/$})
{%data = %+; do_this()}
when(m{^/(?<type>that)_page/$})
{%data = %+; do_that()}
}
Комментировать