使用TTerse语法在Text :: Xslate模板中分配

时间:2016-05-21 20:30:23

标签: perl templates

当我使用Text :: Xslate模板引擎并收集将在Perl脚本中提供给模板的数据时,一切正常并且符合预期:

my %vars = (
    some => {
        nested => {
            thing => 'foobar',
        },
    },
);

# template.tx contains [% some.nested.thing %]
my $content = $tx->render('template.tx', \%vars);

正如预期的那样,[% some.nested.thing %]被“foobar”取代。 如果我以这种方式在模板中分配:

[% some_nested_thing = 'foobar' %]

一切都很好。 但是,当我尝试分配这种方式时:

[% some.nested.thing = 'foobar' %]

它失败并显示以下消息:Text::Xslate::Compiler: Cannot modify ., which is not a lexical variable

那么,甚至可以在Text :: Xslate中分配内部模板吗?

值得注意的是,仍然可以在Text :: Xslate模板中创建多维哈希:

[% some = {
    nested => {
        thing   => 'foobar',
    }
} %]

然后可以引用其中的元素,如[% some.nested.thing %]

2 个答案:

答案 0 :(得分:2)

The manual只讨论制作和分配新变量,而不是现有变量。它甚至不鼓励使用该功能。

  

SET和赋值,虽然强烈使用它们   气馁。

[% SET var1 = expr1, var2 = expr2 %]
[% var = expr %]

答案 1 :(得分:2)

不,这样的可能性不大,如果您阅读the MVC paper手册链接给您,我们就会明白为什么这是一个明确的设计目标。将数据从视图传递回控制器应该是一个很大的禁忌。您可以通过定义一个自定义函数来解决这个问题,您可以使用该函数从模板中回调Perl,但如果您真的想要这样的hack,请三思而后行。