7

我已经“继承”了一些 Tcl 代码,虽然我学习了一些教程并且可以理解该语言,但我自己的 Tcl 构造缺乏一定的……技巧。

例如,我有这个代码:

puts "Column 'name': [ $queryRs getString name ]"

$queryRs是 SQL 查询的结果集。该[ $queryRs getString name ]构造从结果集中的当前行检索表列“名称”的内容。如果数据库字段为 NULL,puts则不打印任何内容。

我想打印一个“默认”字符串,即如果[ $queryRs getString name ]没有结果,我想用"--".

现在,我可以做这样的事情:

set nameVar "[ $queryRs getString name ]"
if { [ string length $nameVar ] == 0 } {
    set nameVar "--"
}
puts "Column 'name': $nameVar"

但是必须有一个更紧凑的解决方案,可以内联完成,而不是添加四行和一个临时变量。请帮忙?

4

2 回答 2

12

两件事情。

首先,Tcl 没有NULL(或其他)值的概念,nil当您想要模拟这样的值时,您必须使用变量并测试它的存在,或者使用 an 中的条目并测试它的也存在。如果存在这样的变量/条目,则定义该值,否则不定义。undefinedarraydict

不幸的是,继承代码的创建者显然并不关心变量与具有默认值的变量(空字符串)无法区分的情况NULLNULLs

接下来,您可以使用帮助程序来执行您需要的操作:

proc ValueOrDef {val {def --}} {
   expr {$val ne "" ? $val : $def}
}

然后像这样:

puts [ValueOrDef [$queryRs getString name]]
puts [ValueOrDef [$queryRs getString name] "some other default"]
于 2012-06-05T10:15:58.823 回答
3

您可以使用命令的x?y:z构造exprx是条件,y满足条件时是备选方案,不满足时z是备选方案x

例如(但仍然有一个临时变量):

set nameVar [ $queryRs getString name ]
puts "Column 'name': [expr {[string length $nameVar]>0 ? $nameVar : "--"}]"
于 2012-06-05T09:00:52.297 回答