我需要创建非常复杂的XML文档(METS),使用前缀,名称空间,模式验证,文档内部引用的元素ID,混合名称空间中的属性......几乎所有XML都允许您这样做。此外,还会出现大量嵌套元素,因此很难手动跟踪起始和结束标记。
研究了几种可能性,我遇到了Template::Declare
。
synopsis提供了一个示例,我在此处展示以供参考:
template simple => sub {
html {
head {}
body {
p { 'Hello, world wide web!' }
}
}
};
我的问题是:Perl语言元素在这里发生了什么?这如何转换为有效的Perl语法?例如,什么是" html"," head"关键字等在这里代表Perl编译器?这是一些隐含的子声明吗? Perl隐含地做了(或允许你做)很多事情我永远不知道实际发生了什么。我不想复制和粘贴一些例子,希望我可以弯曲它做我需要的东西,我真的想知道我在做什么......
有人可以在这里启发我吗?
答案 0 :(得分:3)
CPAN的美妙之处在于您可以只看一下代码。我承认这个有点复杂,但这就是你要找的东西:
https://metacpan.org/source/ALEXMV/Template-Declare-0.46/lib/Template/Declare/Tags.pm#L525
基本上,含糖语法来自prototype &
,它告诉Perl子接受代码引用。这里的{ ... }
不是哈希值,它们是块,与map
或grep
中的块相同。在你的例子中,它们被链接在一起。
由于原型,您可以省略括号和逗号,但您也可以这样编写示例:
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)。
请注意,如果您知道自己在做什么,则只应在代码中使用原型!机会是,你不需要它们。