Я имею дело с веб-приложением, которое использует собственную систему шаблонов, которая позволяет встроить код Perl в HTML.Эти операторы выполняются синтаксическим анализатором шаблона во время выполнения с использованием eval EXPR
.
. Это очень гибко, но эти операторы разбросаны повсюду и выполняются lot .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, выяснить, чего хочет операторделать, и, если это достаточно просто, вызвать соответствующий метод объекта через символьную ссылку.Это явно безумие.
Есть ли какое-то логическое решение, которое я упускаю из виду?