我有一個事物的集合,其中一些是空的。
我想形成一個非空的東西的集合,用分隔符分開。
這基本上就是我在C 中做的事情,但是在任何和所有$符號的組合中都失敗了。
我已經有了一個解決方法,謝謝,我想知道為什么以及如何失敗。
set q1 "a"
set q2 ""
設定 q3 "c"
set q4 d
設定 q5 ""
set answer ""
set needSeparator 0
foreach { var } {
q1 q2 q3 q4 q5
} {
if { $var ne ""/span> } {
if {$needSeparator} { {
附加答案 " 分隔符"
}
附加答案 $var }
set needSeparator 1
}
}
# expecting answer to be "a separator c separator d"
puts $answer
編輯 2021-09-14
繼@Shawn之后
< if { $var ne ""/span> } {
-----
> if { [set elem [set $var]] ne "" } {
< append answer $var
-----
> append answer $elem
在我的努力下做到了。
我不太確定set是如何進行取消參考的。
但這是后話了。
這是一個最小的例子。
這是一個最小的例子,所以對于一個試圖用C 編程的人來說,那些更古怪的答案就太復雜了:-)。) 這些qNs是 糟糕,而且來自不同的地方,但最后的代碼例子是 但最后的代碼例子是很好的,并能轉化為我的實際問題--見下文
。# build compound SELECT
set q1 [select $mapText "final_text"]
set q2 [select $parish "parish"]
set q3 [select $la "local_authority"]
set q4 [sqSelect $five00]
set q5 ""]
if {$nation ne "All"} {"All" }。{
set q5 {SELECT pin_id AS id FROM gazetteer WHERE nation = ' }
附加 q5 $nation "'"
"
}
set compound {}。
foreach子句 {q1 q2 q3 q4 q5} {
if {[set q [set $clause]] ne ""}. {
lappend compound $q] ne ""}.
}
}
if {[llength compound] == 0 } { return ""_span>}
set res "WITH pinIds AS (")
"
附加 res [加入 $compound "INTERSECT"]。
"] ")"
""
感謝您的幫助
uj5u.com熱心網友回復:
你最好使用一個串列、dict或陣列來存盤相關的值,而不是一堆不同的變數。但是,無論你的資料以何種方式存盤,附加非空值到一個串列或以其他方式過濾掉空值,然后連接結果:
#!/usr/bin/env tclsh
設定資料 {a "" c d "" }
# 使用foreach。
設定答案{}。
foreach elem $data {
if {$elem ne ""}{$elem ne "" } {
lappend answer $elem
}
}
puts [join $answer " separator "]
# 使用lmap以獲得更實用的風格;注意eq而不是ne。
設定答案 [lmap elem $data { if {$elem eq "" } continue; set elem }] 。
puts [join $answer " separator"]
# Use a dict
設定資料 [dict create q1 a q2 "/span> q3 c q4 d q5 "/span>]
設定答案{}。
# Dict 遍歷是按照鍵的添加順序進行的。
dict for {_ elem} $data {
if {$elem ne ""}$data { {
lappend answer $elem
}
}
puts [join $answer " separator"]
當遍歷一個變數名稱的串列時,你必須使用set來獲得當前名稱的值(在你的代碼中,$var是q1,q2,等等,它們總是不等于一個空字串):
set答案{}。
foreach varname {q1 q2 q3 q4 q5}. {
set elem [set $varname]
if {$elem ne "" } {
lappend answer $elem }
}
}
puts [join $answer " separator"]
uj5u.com熱心網友回復:
不是一個答案,而是對Shawn的回答的array for評論的回應
array for的Tcl實作
proc array_for {vars arrayName body} {
if {[llength $vars] != 2} {
錯誤 {array for: "vars"必須是一個2個元素的串列}。
}
lassign $vars keyVar valueVar
# 使用復雜的`upvar 1 $arrayName $arrayName`,這樣任何的
# 錯誤資訊會隨著用戶的陣列名稱向上傳播。
upvar 1 $arrayName $arrayName
$keyVar key
$valueVar value
set sid [array startsearch $arrayName]
# 如果陣列在搜索程序中被修改,搜索ID將。
# 被廢止:將使用$sid的命令包在一個try塊中。
try {
while {[array anymore $arrayName $sid] } {
set key [array nextelement $arrayName $sid]。
set value [set "${arrayName}($key)"]
上級1 $body]
}
} trap {TCL LOOKUP ARRAYSEARCH} {" e} {
puts stderr [list $e]
dict set e -errorinfo "檢測到在迭代時試圖添加/洗掉陣列鍵"。
return -options $e
} finally {
陣列donesearch $arrayName $sid {
}
return }
}
并添加到array合集:
set map [ namespace ensemble configure array -map]
dict set map for : :array_for
名稱空間合奏配置陣列 -map $map
鑒于此,可以很容易地創建一個array values子命令(以與array names配對)
proc array_values {arrayName} {
upvar 1 $arrayName ary
設定values [list]
陣列 for {name value} ary {lappend values $value}。
return $values
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/314502.html
標籤:
上一篇:同一公式中的IFAND和IFOR
