【问题标题】:How does the Perl Template::Declare modul work in terms of Perl language syntax?Perl Template::Declare 模块在 Perl 语言语法方面是如何工作的?
【发布时间】:2014-08-24 04:40:49
【问题描述】:

我需要创建非常复杂的 XML 文档 (METS),使用前缀、名称空间、模式验证、文档内部引用的元素 ID、来自混合名称空间的属性……几乎所有 XML 允许您做的事情。此外,还会有大量嵌套的元素,使得手动跟踪开始和结束标签变得困难。

研究了几种可能性,我遇到了Template::Declare

synopsis 提供了一个示例,我在这里展示以供参考:

template simple => sub {
        html {
            head {}
            body {
                p { 'Hello, world wide web!' }
            }
        }
    };

我的问题是:就 Perl 语言元素而言,这里发生了什么?这如何转化为有效的 Perl 语法?例如,这里对于 Perl 编译器的“html”、“head”关键字等代表什么?那是一些隐含的子声明吗? Perl 隐含地做了(或允许你做)很多事情,以至于我永远不知道实际发生了什么。我不想只是复制和粘贴一些示例,并希望我可以弯曲它来做我需要的事情,我实际上想知道我在做什么......

有人可以在这里启发我吗?

【问题讨论】:

  • 作为旁注,我不会将 Template::Declare 用于大型 XML 文档。请改用 XML::Twig 或 XML::Compile。当你必须维护它时,这东西会杀死你。
  • 谢谢 simbabque,我去看看。

标签: xml perl syntax


【解决方案1】:

CPAN 的美妙之处在于您只需看一下代码即可。我承认这个有点复杂,但这是你要找的:

https://metacpan.org/source/ALEXMV/Template-Declare-0.46/lib/Template/Declare/Tags.pm#L525

基本上含糖语法来自prototype&,它告诉Perl sub 正在接受代码引用。这里的{ ... } 不是哈希,它们是块,与mapgrep 中的相同。在您的示例中,它们被链接在一起。

由于原型,你可以省略括号和逗号,但你也可以这样写示例:

template simple => sub {
  html(
    sub {
      head(
        sub { },
        body(
          sub {
            p( sub { 'Hello, world wide web!' } );
          } ) );
    } );
};

如果直接写出来,实现的方式是:

sub template(%) { ... } # the % tells it to expect a hash
sub html(&) { ... }
sub head(&) { ... }
sub body(&) { ... }
sub p(&) { ... }

这种东西叫做Syntactic Sugar,或者DSL (Domain-Specific Language)

请注意,只有在知道自己在做什么的情况下才应该在代码中使用原型!很有可能,你不想要它们。

【讨论】:

  • 很好的答案,谢谢!但我仍然很困惑:那些名为“html”、“head”等的子是如何神奇地定义的?对于 xml,我可以使用任何标签名称,因此它们不能被预先声明。我也对使用 {} 作为子模板(%)中的哈希然后在其他子中用作块分隔符感到困惑。这只是构建大哈希的一些奇特方式吗?
  • 没有散列。那些是块。看看我链接的代码。有_install(),定义在metacpan.org/source/ALEXMV/Template-Declare-0.46/lib/Template/…。它接受一个目标命名空间、一个 coderef 和一个名称,并在该命名空间中导入函数。为 TagSet 中定义的每个标签调用它。我想您必须编写一个 TagSet 或在文档中找到它如何处理任意的。快速浏览并没有为我提供该信息。
  • 再次感谢辛巴克。由于我是 Perl 的新手,因此我认为尝试解析如此复杂的代码并没有多大意义……也许有一天我觉得 Perl 已经成为第二天性:)。这是某人如何将其与任意标签一起使用的示例:justatheory.com/computers/programming/perl/xml-generation.html。 TagSet 有一些东西,但我不是很详细。
  • 他正在定义一个 TagSet 并使用它。但同样,这可能不是您想要的。这篇文章是 2009 年的。这家伙广受好评,但它仍然是 4 岁。如果你有各种花哨的 XML 东西(这是一种过于复杂的说法),你可能有一个 DTD。这意味着您可以非常舒适地使用 XML::Compile。
  • 没有 dtd 但有几个模式。无论如何,在检查了几种可能性(包括您上面的建议)之后,我决定使用大锤解决方案并简单地创建模板文件并进行大量字符串构建和替换;)我看不出这样做有什么很大的优势“正确" 当简单的字符串操作给我相同的结果时的方式。除非我在这里遗漏了一些基本的东西。
猜你喜欢
  • 2015-11-28
  • 1970-01-01
  • 2011-04-30
  • 2014-10-06
  • 2010-12-07
  • 2012-06-07
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多