Tcl:默认变量是否为空?

时间:2012-06-05 08:28:44

标签: string tcl

我已经“继承”了一些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"

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

2 个答案:

答案 0 :(得分:9)

两件事。

首先,Tcl没有NULLnilundefined或其他) value,的概念,当你想模拟这样的时候您必须使用变量和test for its existence或使用array dictionary中的条目并测试其存在的值。如果存在这样的变量/条目,则定义该值,否则不定义。

不幸的是,您继承的代码的创建者显然并不关心变量可以是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 : "--"}]"