列表定义-vmethod似乎不起作用

时间:2018-04-25 07:15:35

标签: perl template-toolkit

在不同的场合我遇到了这个问题。

我想测试列表中是否定义了某个值,但列表vmethod只返回false;

例如在这种情况下:

  lines = "polyline";
  validLineOptions = ['line', 'polyline', 'curved', 'ortho', 'spline'];
  IF validLineOptions.defined(lines);
    GET( "/* using style " _ lines _ "*/\n");
  ELSE;
    GET( "/* using default style */\n");
    lines = '';
  END;  

这总是在ELSE子句中运行。

某些版本信息:

This is perl 5, version 26, subversion 0 (v5.26.0) built for MSWin32-x86-multi-thread-64int

  Wed May 31 02:57:08 2017: "Module" Template
    *   "installed into: C:\strawberry\perl\vendor\lib"
    *   "LINKTYPE: dynamic"
    *   "VERSION: 2.27"
    *   "EXE_FILES: bin/tpage bin/ttree"

1 个答案:

答案 0 :(得分:2)

您不能使用列表元素的值来查找它。

这是the documentation关于列表(TT中的数组)defined的说法。

  

如果列表中的项由表示,则返回true或false值   论证是定义的。

[% list.defined(3) ? 'yes' : 'no' %]
     

在没有任何参数的情况下调用时,如果是,则list.defined返回true   列表本身已定义(例如与scalar.defined相同的效果)。

然而,这就是你所做的。

lines = "polyline";
validLineOptions.defined(lines)

这使用带有字符串值的变量lines作为列表的索引。索引应该是一个数字,因为我们没有处理 hash (关联数组)。此列表中的值已排序和编号。您无法按值访问它们。

我认为您要做的是检查列表中是否存在该值。有几种方法可以做到这一点。

validLineOptions.grep(lines)

使用grep查找数组中的元素,并检查返回值的数量是否为true。如果没有匹配,则返回false。

但是,您也可以使用哈希作为查找。

lines = "polyline";
validLineOptions = {
    'line'     = 1, 
    'polyline' = 1, 
    'curved'   = 1, 
    'ortho'    = 1, 
    'spline'   = 1
};
IF validLineOptions.exists(lines);

这将检查散列中的是否存在。这是一种检查是否允许值的简单方法。