определение и цикл через массивы 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];
}

Я хотел бы сделать то же самое с tcl.Подходит ли следующий код?

set size 0
set date[$size] $pre_event_date
#After performing some manipulation
for {set i 0} { $i <=$size } {incr i} {
    puts "$date[$i]";
}

также я могу определить set $date как массив. Некоторые любят, как:

set date array();

поэтому я отредактировал свой код, попробовал простой тест, используя реализацию массива RSeeger:

set date(0) 35
set date(1)  40
foreach key [array names date]{
   puts "${key}=$date($key)"
}

вышеуказанное ничего не возвращает вероятно, произошла какая-то ошибка. Я также пытался: ставит $date ($key) без кавычек, но это тоже не работает.

3 ответов


если вы хотите индексировать вещи по номеру (что подразумевает ваш код), используйте list. Он аналогичен массиву в 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]"
}

если вы хотите индексировать вещи по строке (или иметь разреженный список), вы можете использовать array, который является хэш-картой key - > value.

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)"
}

в 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, и это страница массиве и массив man page для синтаксических проблем, поскольку я не вижу смысла повторять большую часть их содержимого здесь.


массивы TCL ближе к тому, что Python называет dict, и хэшу в Perl. Таким образом, это помогает думать об индексе как о ключевой строке, а не о целочисленном индексе:

set groceries(fruit) "banana"
set groceries(1) "banana"

можно использовать массив функция для выполнения полезных вещей, таких как создание списка из всех ключей, и вы можете перебирать этот список, если вам нужно. Например, вы можете создать список ключей, а затем использовать llength чтобы получить размер массива.

это работает лучше всего, если вам нужно уникальный индекс, чтобы найти их. Если вам просто нужен упорядоченный список, чем вам может быть лучше использовать фактические функции списка, такие как lappend.