2012-06-05 57 views
4

我已經「繼承」了一些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" 

成爲一個更緊湊的解決方案,這東西可以在線完成添加四行和臨時變量代替。請幫助?

回答

9

兩件事。

首先,TCL不具備的NULLnilundefined或其他)值,一個概念,當你想模仿你必須使用變量這樣的值和test for its existence或使用的條目arraydictionary並測試它的存在。如果存在這樣的變量/條目,則定義該值,否則不是。

不幸的是,你的繼承代碼的創建者顯然不關心變量可能爲NULL的情況,所以NULLs與具有默認值(空字符串)的變量無法區分。

接下來,你可以使用一個輔助程序,你需要的東西:

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

,然後是這樣的:

puts [ValueOrDef [$queryRs getString name]] 
puts [ValueOrDef [$queryRs getString name] "some other default"] 
+0

啊......我知道默認參數,但沒有通過這樣的函數建立連接來提供'name'。謝謝,這是我一直在尋找的。 – DevSolar

+0

那麼,這個函數並不是非常必要的 - 只需使用'expr'及其作爲@bmk提供的三元條件運算符即可脫身;一個專門的功能只是使意圖更清晰。 – kostix

+1

是的,但通常比其他方式更容易使定義複雜且使用簡單。 – DevSolar

3

您可以使用expr命令的x?y:z構造。 x是條件,如果條件得到滿足,y是替代方案,如果不符合x,則z是替代方案。

E.g. (但仍有一個臨時變量):

set nameVar [ $queryRs getString name ] 
puts "Column 'name': [expr {[string length $nameVar]>0 ? $nameVar : "--"}]" 
+0

一個襯墊總是優先+1 – tetris11