在不同的场合我遇到了这个问题。
我想测试列表中是否定义了某个值,但列表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"
答案 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);
这将检查散列中的键是否存在。这是一种检查是否允许值的简单方法。