2010-02-18 1 views
0

Я просто оказался в положении, когда у меня есть два массива в Tcl.Соответствие двух массивов

Мне даны $W_Array и $P_Array.

Мне нужно пройти через один массив, не зная, какой размер каждого из них перед рукой, и выполнить команду только тогда, когда для обоих массивов есть значение. Да длины массива могут быть разными.

Каков наилучший способ сделать это?

+0

Похоже, вы действительно означают списки, которые больше похожи на то, что другие языки называют массивы. Tcl массивы являются хэш-картами. Вы можете взять длину списка Tcl, но не массив Tcl, не преобразовывая его. –

+0

Если вы можете уточнить, имеете ли вы в виду списки (a, b, c) или массивы (a = X, b = Y, c = Z), ответы, вероятно, будут более полезными. – RHSeeger

ответ

1

Не уверен, что вы подразумеваете под «значением для обоих массивов», но tcl foreach поддерживает итерацию сразу по нескольким массивам ... так что вы можете сказать, например. foreach w $W_Array p $P_Array { if {$w == $val && $p == $val} { ... } }

Когда массивы не такие же длины, foreach возвращает все значения из самого длинного массива и пустого значения {} для недостающих элементов в любых коротких массивах.

-1

Команда llength, чтобы узнать, содержат ли массивы значение.

if {[llength $W_Array] > 0 && [llength $P_Array] > 0} { 
# Do something 
} 
+0

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

3

Другие ответы прыгнули с использованием списков, я полагаю, вы имеете в виду Tcl's array, которые также называются хеш-карты или ассоциативные массивы.

Я думаю, что вы просите что-то вроде:

array set a1 {a 1 b 2 c 3 d 4 e 5} 
array set a2 {z 0 x 1 b 2 e 99} 
foreach n [array names a1] { 
    if {[info exists a2($n)]} { 
    puts "Do something with $a1($n) and $a2($n)" 
    } 
} 

# FOREACH LOOP RESULTS IN THESE TWO PRINTOUTS 
Do something with 5 and 99 
Do something with 2 and 2 

 Смежные вопросы

  • Нет связанных вопросов^_^