我已经“继承”了一些Tcl代码,虽然我已经完成了一些教程并且可以理解语言,但我自己的Tcl构造缺乏某种精妙的技巧。
例如,我有这段代码:
puts "Column 'name': [ $queryRs getString name ]"
$queryRs
是SQL查询的结果集。 [ $queryRs getString name ]
构造从结果集中的当前行检索表列“name”的内容。如果数据库字段为NULL,则puts
不会打印任何内容。
我想打印一个“默认”字符串,即如果[ $queryRs getString name ]
没有结果,我想用"--"
替换它。
现在,我可以这样做:
set nameVar "[ $queryRs getString name ]"
if { [ string length $nameVar ] == 0 } {
set nameVar "--"
}
puts "Column 'name': $nameVar"
但是已经成为一个更紧凑的解决方案,可以内联而不是添加四行和一个临时变量。请帮帮忙?
答案 0 :(得分:9)
两件事。
首先,Tcl没有NULL
(nil
,undefined
或其他) value,的概念,当你想模拟这样的时候您必须使用变量和test for its existence或使用array
dict
ionary中的条目并测试其存在的值。如果存在这样的变量/条目,则定义该值,否则不定义。
不幸的是,您继承的代码的创建者显然并不关心变量可以是NULL
的情况,因此NULLs
与具有默认值(空字符串)的变量无法区分。
接下来,您可以使用帮助程序来执行所需操作:
proc ValueOrDef {val {def --}} {
expr {$val ne "" ? $val : $def}
}
然后像这样:
puts [ValueOrDef [$queryRs getString name]]
puts [ValueOrDef [$queryRs getString name] "some other default"]
答案 1 :(得分:3)
您可以使用x?y:z
命令的expr
结构。 x
是条件,y
是满足条件的替代方案,z
是替代条件,如果不符合x
。
E.g。 (但仍有临时变量):
set nameVar [ $queryRs getString name ]
puts "Column 'name': [expr {[string length $nameVar]>0 ? $nameVar : "--"}]"