2014-09-03 146 views
0

我想從一個現有的項目列表中創建一個新的數組/列表。我想檢查項目是否先存在,如果不存在,則創建它然後爲其添加值。如果它已經存在,只需附加一個值。我也需要一種方法來獲得總數的長度。從列表項創建列表

set Area {23401 23402 23403} 
    foreach Item $Area { 
     set ElExist [info exist ${Item}lst] 
     if {$ElExist == 0} { 
     set ${Item}lst {}; 
     lappend ${Item}lst $TotalRecords 
     } else { 
     lappend ${Item}lst $TotalRecords 
     } 
     set CurrentOptinon [llength ${Item}lst] 
    } 
+0

呃,這很難理解你想要做什麼。你能否提供一些更多的信息,比如一些虛擬的現有變量,以及你期望得到什麼結果,比如哪些數組/列表? – Jerry 2014-09-03 08:06:30

+1

如果var名稱不存在,'lappend'將創建一個新變量。如果你想檢查變量是否存在,你可以保留它。否則,你可以刪除它。但是,你的問題並不清楚。 – Dinesh 2014-09-03 08:31:29

回答

1

如果我寫的代碼,我會做這樣的:

set Area {23401 23402 23403} 
foreach Item $Area { 
    upvar 0 ${Item}lst lst 
    lappend lst $TotalRecords 
    set CurrentOptinon [llength $lst] 
} 

這將表現與您的代碼,但它是如此短得多。以下是使用中的技巧:

  1. lappend如果它不存在,則創建一個變量。
  2. upvar 0將當地的別名設爲變量。非常簡單。
  3. 別名消除了與llength神奇的需要,但除此之外,你可以做:

    set CurrentOptinon [llength [set ${Item}lst]] 
    

    $語法在許多方面只是一個短期削減來的單參數版本的調用set,其中讀取指定的變量。除非你寫set那麼你可以在你的變量名中使用替換。作爲一個經驗法則,如果您在變量中廣泛使用變量名稱而不會出現別名,那麼您可能會出錯(除非您確實需要名稱)。

  4. 您正在使用奇怪的變量名稱。更好的是一個數組。

    set Area {23401 23402 23403} 
    foreach Item $Area { 
        lappend lst($Item) $TotalRecords 
        set CurrentOptinon [llength $lst($Item)] 
    } 
    

    但是,這很可能要求您在別處更改代碼。

+0

我想感謝你總是這麼樂於助人。當我需要任何TCL的幫助時,您一直很快回復任何問題。問題是你的電子郵件仍然是[email protected]?我在TCL社區發現了這個。 – CK1 2014-09-03 20:10:38