Perl:模板工具包的替代品

Posted

技术标签:

【中文标题】Perl:模板工具包的替代品【英文标题】:Perl: Alternatives to template toolkit 【发布时间】:2012-12-23 13:33:50 【问题描述】:

我使用模板工具包扩展现有的特定领域语言(verilog)已有 3 年多了。虽然总体上我对此感到满意,但主要的问题是当出现语法/undef 错误时,错误消息不包含用于调试错误的正确行号信息。

例如我会收到一条消息,指出“0 未定义”,因为我将在文件中的多个位置使用 [%x.0%] 和类似的构造来确定哪一行有问题变得困难。

TT3 似乎正在无限期开发中

我对大师的问题是,有没有比 TT 更好的替代品。我的要求是

    支持复杂的数据结构 良好的错误报告和调试功能。 稳定且经过验证(无 alpha/beta 级引擎) 可扩展(插件等) 不应仅限于给定语言(html 等) 支持 IF/Else、循环(foreach while)、循环索引等。 最好是perl 支持模板内的数据转储器或等效插件是一个优点

【问题讨论】:

这是一篇旧文章。我认为它不完整(例如不包括 xslate),但仍可能对您有所帮助:perl.apache.org/docs/tutorials/tmpl/comparison/comparison.html Xslate 【参考方案1】:

我只能在这里推荐Text::Xslate。它在各方面都比 TT 好,并且也击败了大多数竞争对手。最后,它符合您的所有要求。字面上地。全部。

它甚至在实践中得到了证明,因为它被全球 100 强网站之一和日本 10 强网站之一使用:Livedoor

Xslate 与 TT 相比:

更快的启动 处理速度更快 默认为严格模​​式 比“var is undef”更高级的严格模式可以捕获不一致 显示准确模板位置的详细错误 自动 HTML 实体转义(XSS 安全) actively maintained 而不仅仅是left to languish 语法简单而现代的 perl

针对您的特殊情况需要注意两点:

    当您从 TT 移植时,您可能希望将 syntax => 'TTerse' 传递给构造函数,以获得设计为尽可能接近 TT 的语法。 生成非 HTML 时,您希望将 type => 'text' 传递给构造函数以禁用 html_escape 插值。

【讨论】:

我同意 xslate 符合我的大部分规范。但是由于 Template Alloy 解决了我的主要问题(隐秘的错误消息)并且具有类似于 TT 的语法(减少迁移头痛),我将在我的项目中使用它 您确实看到了我写的关于在 Xslate 中启用 TT 语法的说明? T::A 没有一件事比 Xslate 更好,而且在许多方面它明显不如 Xslate。您在这里选择了更糟糕的选择,因为只能被描述为“没有任何理由”。 我同意你可能是对的。这些天我会做一个 Xslate 的评估。如果您说 XSlate 支持完整的 TT 语法,则转换应该是无缝的。完成评估后,我将回来并评论此线程 我没想到会有答案,所以我不得不说:谢谢。 :) 需要注意的是,TT 语法不是完全 支持的,但它支持的足够多,转换应该是非常微不足道的。 :) 我将 Xslate 与 Template 和 mojo::template 进行了基准测试,我发现 Xslate 不再那么快了。它比 Template 快 5 倍,比 mojo::template 慢 2 倍。【参考方案2】:

我目前正在尝试使用Template::Alloy,总的来说,它似乎是 TT 的替代品。 Template::Alloy::TT 列出了 TT 和 Alloy 之间的区别,其中大部分是“Alloy 中允许/允许,但 TT 中不允许”的形式。针对您的具体问题,该列表包括:

Alloy 具有更好的线路信息

当调试目录打开时,不同行上的指令由 冒号表示它们所在的行,而不是一般的行范围。

解析错误实际上知道它们发生在什么行和字符处。

【讨论】:

今天测试过的模板::合金。 Debug_dirs 不适合我的目的,因为它假定我正在生成 HTML 并插入 HTML 样式的 cmets。对于 x=[] /*empty array*/ 后跟模板中某处的 x.0 Template::Alloy 的情况相对更有帮助,因为它给出了完整的消息 x.0 is not defined 而不是 TT2 说 0未定义....明天将尝试 Xslate。 如果我使用 Template::Alloy 和 DEBUG => DEBUG_DIRS 我得到“var.undef 错误 - 未定义变量:ln.tt 中的条形图”。但它缺少线路信息 作为以后偶然发现此问题的任何人的说明:T::A 略好于 TT,但远不如 CPAN 上的任何其他模板库。最可恶的是,它已被其维护者抛弃,最后一个版本是“SEP 20, 2013”​​,大约 2 年前。 @Mithaldu - 感谢您的更新!这些天我自己也在使用 Xslate。【参考方案3】:

Mojolicious 带有自己的模板系统Mojo::Template。它重量轻,甚至可以在 mojolicious 系统之外使用。这是文档中的一个示例:

use Mojo::Template;
  my $mt = Mojo::Template->new;

  # Simple
  my $output = $mt->render(<<'EOF');
  % use Time::Piece;
  <!DOCTYPE html>
  <html>
    <head><title>Simple</title></head>
    % my $now = localtime;
    <body>Time: <%= $now->hms %></body>
  </html>
  EOF
  say $output;

还有一个

  # More advanced
  my $output = $mt->render(<<'EOF', 23, 'foo bar');
  % my ($number, $text) = @_;
  %= 5 * 5
  <!DOCTYPE html>
  <html>
    <head><title>More advanced</title></head>
    <body>
      test 123
      foo <% my $i = $number + 2; %>
      % for (1 .. 23) 
      * some text <%= $i++ %>
      % 
    </body>
  </html>
  EOF
  say $output;

【讨论】:

@downvoter,想发表评论吗? Mojo::Template 解决了所有 OP 问题,并且安装和开始使用快速简便。【参考方案4】:

我可以建议 HTML::Template:Compiled(但请注意我是作者 ;-)

它与 HTML::Template 非常兼容,但具有附加功能。

支持复杂的数据结构

是的

良好的错误报告和调试功能。

您可以调试缓存命中、未命中、自动将模板文件名添加到输出,并且可以对存储中的当前变量(或任何变量)使用过滤器“DUMP”。 如果它易于实现,我会很乐意添加更多有用的调试。

稳定且经过验证(无 alpha/beta 级引擎)

我认为它现在很稳定,有记录的限制/错误(例如 query())

可扩展(插件等)

支持转义(过滤器)插件等,尽管后者的文档还不是很好。

不应仅限于给定的语言(html 等)

是的

支持IF/Else、循环(foreach while)、循环索引等。

是的

最好是perl

是的

支持模板内的数据转储器或等效插件是一个加分项

如上所述,使用 escape=dump

文档中列出了所有附加功能: https://metacpan.org/release/HTML-Template-Compiled 在“附加功能”中

编辑:关于报告运行时错误:不幸的是,H::T::C 也不会报告运行时发生的错误的模板行号,因为它将模板编译为 perl 代码(我想我尝试过操作行数字一次,也许我会再看看)。 使用正确的行号报告模板语法错误。

编辑2: 下面是一个带有新选项警告和 line_info 的示例:

t/templates/line_info1.html:

test
test2
test3
foo:<%= foo %> undef line 4
test4

脚本:

use HTML::Template::Compiled;
my $t = HTML::Template::Compiled->new(
    filename => "t/templates/line_info1.html",
    warnings => 1,
    line_info => 1,
);
say $t->output;
__END__
Use of uninitialized value in concatenation (.) or string at t/templates/line_info1.html line 4.
test
test2
test3
foo: undef line 4
test4

【讨论】:

tinita,很遗憾,我希望摆脱 TT 只是因为它没有报告错误的正确行号:( @vijayvithal:我又看了看,似乎可以通过为 WARN 添加一个 SIG 处理程序并通过 #line 指令操作行号。测试套件成功。 哦,我根本不需要 sig 处理程序。我考虑在下一个版本中添加一个选项来激活此功能。 @vijayvithal:我上传了 1.000_004。添加选项“警告”和“line_info”(忘记更新更改文件)【参考方案5】:

查看Template::Semantic 了解纯模板抽象

【讨论】:

以上是关于Perl:模板工具包的替代品的主要内容,如果未能解决你的问题,请参考以下文章

作为sed替代方案的Perl就地替换

Pyp–一个替代sed,awk的文本处理工具

perl替代sed分裂多个|

使用 perl 发送带有文件附件的多部分文本/html 替代消息,

如何使用 Perl 模块中的常量?

asp.net ajax 4.0 模板的替代品