<div dir="ltr">прочтое чтение доки подсказывает<div><br></div><div>$template_processor = Mojo::Template->new()->prepend("use YourHelpers;");</div><div><br></div><div>package YourHelpers'</div><div><br></div><div>use Exporter qw( import );</div><div><br></div><div>our @EXPORT = qw( my_helper );</div><div><br></div><div>1;</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">15 июня 2017 г., 16:17 пользователь Alexander M. Pravkin via Moscow-pm <span dir="ltr"><<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a>></span> написал:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Уважаемые почитатели Mojolicious, помогите с такой проблемой.<br>
<br>
Есть некоторое число проектов, которые благополучно работают на perl<br>
5.16-5.20, но на свежем валятся, ибо там повсеместно используются<br>
конструкции, не рекомендованные к использованию. Собственно, встала<br>
задача исправить это безобразие.<br>
<br>
С самим кодом проблем нет, проблемы есть с embedded-perl-шаблонами Mojo.<br>
Если бы их была пара штук или хотя бы пара десятков, можно было бы и<br>
вручную обойти. Но их около сотни только в одном проекте.<br>
<br>
В общем, понадобилась автоматическая валидация, хотя бы по синтаксису.<br>
На просторах, увы, не нашёл ничего, решил попробовать сам.<br>
<br>
Простые шаблоны нормально обрабатываются вот таким скриптом:<br>
<br>
<br>
use strict;<br>
use open qw(:std :utf8);<br>
use Mojo::Template;<br>
<br>
my $file = $ARGV[0]<br>
    or die "Usage: $0 mojo-template.ep\n";<br>
<br>
my $mt = Mojo::Template->new(vars => 1);<br>
<br>
my $res;<br>
# Проход первый: ищем необъявленные переменные<br>
{<br>
    local $SIG{__WARN__} = sub {};<br>
    $res = $mt->render_file($file)<br>
        or die "render_file $file returned nothing\n";<br>
}<br>
<br>
# Если ошибок не было -- всё OK<br>
ref $res and $res->isa('Mojo::Exception')<br>
    or exit 0;<br>
<br>
# Ищем все переменные, используемые шаблоном<br>
# Считаем, что автор кода тоже передаёт render'у все нужные<br>
my $errors = "$res";<br>
my %stash = map { $_ => undef }<br>
    ($errors =~ /Global symbol "\$(\w+)" requires explicit package name/g);<br>
delete $stash{_O}; # подставная переменная Mojo::Template<br>
<br>
print "+++ $file variables: ", join(' ', sort keys %stash), "\n";<br>
<br>
# Проход второй, настоящие ошибки<br>
$res = $mt->render_file($file, \%stash);<br>
if (ref $res and $res->isa('Mojo::Exception')) {<br>
    die "\n--- $file has errors:\n$res\n";<br>
}<br>
<br>
<br>
Но он, как минимум, не понимает helper'ов от всяких плагинов (layout,<br>
include и прочие form_for). Присобачить использование плагинов к<br>
одинокому Mojo::Template я ниасилил. Кто-нибудь может подсказать?<br>
<span class="HOEnZb"><font color="#888888"><br>
<br>
--<br>
Правкин Александр<br>
--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" rel="noreferrer" target="_blank">http://moscow.pm.org</a><br>
</font></span></blockquote></div><br></div>