我已经"继承"了一些Tcl代码,虽然我已经完成了一些教程并且能够理解语言,但是我自己的Tcl构造缺乏一定的技巧.
例如,我有这个代码:
puts "Column 'name': [ $queryRs getString name ]"
Run Code Online (Sandbox Code Playgroud)
$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"
Run Code Online (Sandbox Code Playgroud)
但必须有一个更紧凑的解决方案,可以内联完成,而不是添加四行和一个临时变量.请帮忙?
kos*_*tix 10
两件事情.
首先,TCL不具备的概念NULL(nil,undefined或其他)值,而当你想模仿你必须要么使用一个变量,这样的值测试它的存在或在使用中的条目array的dictionary并测试其存在也是.如果存在这样的变量/条目,则定义该值,否则不定义.
不幸的是,你的继承代码的创造者显然没有在意,其中一个变量可以的情况下NULL使NULLs来自患有默认值(空字符串)变量没有什么区别.
接下来,您可以使用帮助程序来执行您需要的操作:
proc ValueOrDef {val {def --}} {
expr {$val ne "" ? $val : $def}
}
Run Code Online (Sandbox Code Playgroud)
然后像这样:
puts [ValueOrDef [$queryRs getString name]]
puts [ValueOrDef [$queryRs getString name] "some other default"]
Run Code Online (Sandbox Code Playgroud)