Perl Template :: Declare模块如何根据Perl语言语法工作?

时间:2014-08-18 10:22:32

标签: xml perl syntax

我需要创建非常复杂的XML文档(METS),使用前缀,名称空间,模式验证,文档内部引用的元素ID,混合名称空间中的属性......几乎所有XML都允许您这样做。此外,还会出现大量嵌套元素,因此很难手动跟踪起始和结束标记。

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

基本上,含糖语法来自prototype &,它告诉Perl子接受代码引用。这里的{ ... }不是哈希值,它们是块,与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 SugarDSL (Domain-Specific Language)

请注意,如果您知道自己在做什么,则只应在代码中使用原型!机会是,你不需要它们。