Я имею дело с веб-приложением, которое использует домашнюю систему шаблонов, которая позволяет встроить Perl-код в HTML. Эти операторы выполняются парсером шаблонов во время выполнения с помощью eval EXPR
.
Это очень гибко, но эти заявления разбросаны повсюду, и они выполняются много. eval EXPR
(в отличие от eval BLOCK
) требует, чтобы Perl каждый раз запускал интерпретатор, и мое профилирование показывает, что они являются достаточно значительным источником замедления.
Многие встроенные операторы Perl очень просты. Например, шаблон может иметь такую строку:
<p>Welcome, <!--E: $user->query('name') -->.
Или:
<p>Ticket number <!--E: $user->generate_ticket_number() --> has been generated.
То есть, они просто вызывают методы объектов. Однако есть и более сложные.
Я надеюсь оптимизировать это, и до сих пор есть две идеи, обе из которых ужасные. Первый заключается в том, чтобы переписать все шаблоны, чтобы заменить простые вызовы токенами, такими как USER:NAME
и USER:GENERATETICKETNUMBER
, которые синтаксический анализатор мог затем выполнить поиск и вызвать соответствующий метод объекта. Но вместо того, чтобы иметь дело с шаблонами, которые смешивают HTML и Perl, у меня бы были шаблоны, которые смешивают HTML, Perl и токены.
Вторая идея - попытаться разобрать встроенный Perl, выяснить, что хочет сделать оператор, и, если он достаточно прост, вызовите соответствующий метод объекта с помощью символической ссылки. Это, безусловно, безумие.
Есть ли какое-то логическое решение, которое я пропускаю?