【发布时间】:2014-07-17 18:03:08
【问题描述】:
我需要在模板工具包中为数组类型的附件检测一些变量。 有最佳做法吗?
【问题讨论】:
-
我不明白。您能否举例说明您正在努力实现的目标,以及您尝试过但没有成功的事情?
-
TT模板文件中有变量:
[% var %]。我需要检测这个变量的类型(数组与否)。
标签: perl types template-toolkit
我需要在模板工具包中为数组类型的附件检测一些变量。 有最佳做法吗?
【问题讨论】:
[% var %]。我需要检测这个变量的类型(数组与否)。
标签: perl types template-toolkit
【讨论】:
$Template::Stash::SCALAR_OPS->{ size } = sub { undef }; $Template::Stash::HASH_OPS->{ size } = sub { undef }; 来规避它们,然后测试 var.size 的结果是否已定义,即[% IF var.size.defined; 'ARRAY'; END %].
[% hashref = { }; hashref.size %]。如果您阅读了我的答案,则可以通过定义自己的虚拟方法来解决您的问题。我定义了一个通用的 ref ,但您可能更喜欢定义一个 is_array() 。
可以定义一个自定义虚拟方法,该方法返回所提供变量的 ref 类型。粗略的例子:
#!/usr/bin/perl
use strict;
use warnings;
use Template;
use Template::Stash;
$Template::Stash::SCALAR_OPS->{ ttref } = \&ttref;
$Template::Stash::LIST_OPS ->{ ttref } = \&ttref;
$Template::Stash::HASH_OPS ->{ ttref } = \&ttref;
my $t = Template->new( );
$t->process( \*DATA, { vars => [ 1, [ ], { } ] } );
sub ttref
{
return ref $_[0];
}
__DATA__
[% FOREACH var IN vars -%]
ref type of [% var %] is [% var.ttref %]
[% END %]
输出:
ref type of 1 is
ref type of ARRAY(0x9cfbd0) is ARRAY
ref type of HASH(0x9cfc00) is HASH
【讨论】: