7

私はいくつかの Tcl コードを「継承」しました。いくつかのチュートリアルに取り組み、言語を理解することはできましたが、私自身の Tcl コンストラクトには特定の... フィネスが欠けています。

たとえば、次のコードがあります。

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

$queryRsSQL クエリの結果セットです。この[ $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"

しかし、4 行と一時変数を追加する代わりにインラインで実行できる、よりコンパクトなソリューションが必要です助けてください?

4

2 に答える 2

12

2つのこと。

NULLまず、Tcl には(nilなどのundefined)の概念がありません。そのような値をシミュレートする場合は、変数を使用してその存在をテストarrayするか、変数のエントリを使用してその存在をテストするdict必要があります。存在も。そのような変数/エントリが存在する場合、値は定義されていますが、そうでない場合は定義されていません。

残念ながら、継承されたコードの作成者は、変数がデフォルト値 (空の文字列) を持つ変数と区別できない場合を気にしていないNULLようです。NULLs

次に、ヘルパー プロシージャを使用して、必要なことを行うことができます。

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 に答える