定义和循环数组tcl

定义和循环数组tcl,tcl,Tcl,我需要一些帮助来定义数组,并在TCL中显示和循环数组 下面是我将如何在php中实现它们 $date =array(); $size=0; $date[$size] =$pre_event_date; /* After doing some manpulation and calculations with $size */ for($i=0;$i<=$size;$i++){ echo $date[$i]; } 因此,我编辑了我的代码,并使用RSeeger的数组实现尝试了一个简单的

我需要一些帮助来定义数组,并在TCL中显示和循环数组

下面是我将如何在php中实现它们

$date =array();
$size=0;
$date[$size] =$pre_event_date;
/* After doing some manpulation and calculations with $size */
for($i=0;$i<=$size;$i++){
    echo $date[$i];
}
因此,我编辑了我的代码,并使用RSeeger的数组实现尝试了一个简单的测试:

set date(0) 35
set date(1)  40
foreach key [array names date]{
   puts "${key}=$date($key)"
}
上面没有返回任何内容,可能有错误。 我还尝试:
在Tcl中,数组的概念不同于许多其他编程语言,Tcl所称的数组在其他地方通常称为哈希映射或关联数组。数组索引不仅限于整数,还可以是任何合法字符串。大多数时候,我发现自己使用列表(或列表列表)而不是数组来进行数据操作。要在整个列表或数组中循环,可以使用foreach命令

foreach {index content} [array get date] {
    put $index: $content
}
在设置数组的值之前不必初始化数组,只需开始添加成员即可。单个数组成员被引用为

 $array($key) or $array("abc")
Tcl中没有多维数组,但可以通过使用一致的键名来模拟它们

set a(1,1) 0
set a(1,2) 1
...

除此之外,我只想向您介绍最优秀的Tcl wiki,它的语法问题,因为我看不出有必要在这里重复它们的大部分内容。

Tcl数组更接近Python所称的dict和Perl中的哈希。 因此,将索引视为键串而不是索引整数会有所帮助:

set groceries(fruit) "banana"
set groceries(1) "banana"
您可以使用该函数执行有用的操作,例如生成列表 如果需要,您可以遍历该列表。 例如,您可以生成一个键列表,然后使用来获取数组大小

如果您需要一个唯一的索引来查找它们,那么这种方法最有效。
如果您只需要一个有序的列表,那么最好使用实际的列表函数,如。

如果您希望按数字(您的代码意味着)对事物进行索引,请使用
列表。它类似于C中的数组

set mylist {}
lappend mylist a
lappend mylist b
lappend mylist c
lappend mylist d
foreach elem $mylist {
    puts $elem
}
// or if you really want to use for
for {set i 0} {$i < [length $mylist]} {incr i} {
    puts "${i}=[lindex $mylist $i]"
}

因此,我想我必须以一种与我上面编写代码的方式稍有不同的方式来完成这项工作。正如Edu所提到的-foreach非常适合处理列表,如果列表适合解决您的问题,则很有可能会使您的生活更轻松。在这种情况下,我需要类似于上述代码的数组。在我目前的情况下,我看不到适合我的列表。取决于$pre_event_date的内容-也许您可以使用“split”命令。填充实际的列表或数组似乎是决定什么最适合您的部分-但是因为您只使用了一个计数器作为索引,所以我会确保您在决定之前先查看llindex。谢谢@RHSeeger。我试过你的一种方法,但不管用。看到我上面的编辑,我仍然认为最好使用列表而不是数组。@user856753,还请注意,Tcl数组可能会对来自其他语言的程序员感到不方便,因为它们本身不是值,所以您不能将数组传递到进程中并返回它们;只能传递数组的名称。从8.5版开始,Tcl就有了一流的价值观。因此,如果您需要hashmap并可以使用Tcl 8.5+,请查看
dict
命令。我不是Tcl脚本方面的专家,但对于{set I 0}{$I<[llength$mylist]}{incr I}{
而不是{set I 0}{$I<[length$mylist]}{incr I}{/code>(length>llength)来说,它不是
您可能会从中受益,上一个代码片段的问题是它在
[array names date]
{
之间缺少一个空格。这个空格在Tcl中很重要!它分隔了正在迭代的内容(序列化的数组内容)从脚本到每次迭代执行。一般来说,使用Tcl时,您必须正确地分隔单词;它很快成为第二天性(我现在在许多其他语言中也倾向于做同样的事情,因为额外的空格几乎可以提高所有地方的可读性,前提是它在语义上是合法的)。您可以通过嵌套列表来创建多维结构;
lindex
lset
都有专门针对这种情况的多索引表单。对于需要这类内容的情况,它运行良好(而且速度也很快)。
set groceries(fruit) "banana"
set groceries(1) "banana"
set mylist {}
lappend mylist a
lappend mylist b
lappend mylist c
lappend mylist d
foreach elem $mylist {
    puts $elem
}
// or if you really want to use for
for {set i 0} {$i < [length $mylist]} {incr i} {
    puts "${i}=[lindex $mylist $i]"
}
set myarr(chicken) animal
set myarr(cows) animal
set myarr(rock) mineral
set myarr(pea) vegetable

foreach key [array names myarr] {
    puts "${key}=$myarr($key)"
}