2014-09-03 77 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