2016-08-03 6 views
0

У меня проблема с TCL-скриптом. ниже в коде у меня есть список:Получение значения числовой переменной списка в TCL

set arcs { 
    {a b $myVar(0)} {b a $myVar(1)} {b c $myVar(2)} {c f $myVar(3)} {b d $myVar(4)} 
} 

в $ MYVAR ($ я), хранящийся числовое значение. и у меня есть функции, такие как это:

proc myProc arcs { 
    foreach arc $arcs { 
    lassign $arc v1 v2 cost 
    dict set graph $v1 $v2 $cost 
    } 
    return $graph 
} 

Я называюсь функцией:

myProc $arcs 

, но в функции, я не могу извлечение числового значения, хранящееся в $ AB ($ I) и только имя переменных, хранящихся в $ cost. например:

$v1 ----> a 
$v2 ----> b 
$cost ----> $myVar(0) 

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

$v1 ----> a 
$v2 ----> b 
$cost ----> 25 /// value of $myVar(0) 

Я новичок в tcl, и я не могу решить эту проблему. Я буду очень признателен за вашу помощь.

ответ

0

Проблема состоит в два раза. Во-первых, входной список не имеет значения переменной, а скорее буквальной строки, а во-вторых, контекст, в котором вам требуется значение, не является контекстом, в котором значение известно. Чтобы исправить это, нам нужно определить, когда применять исправление (regexp - мой любимый подход), и в этом случае использовать upvar 1, чтобы привести переменную, о которой идет речь, во временную область с красивым именем, чтобы мы могли заменить стоимость ее стоимость.

proc myProc {arcs} { 
    foreach arc $arcs { 
     lassign $arc v1 v2 cost 
     # Detect if we've got something we want to interpret as a variable use 
     if {[regexp {^\$(.*)$} $cost -> varName]} { 
      # NOTE: DO NOT USE [upvar 1 $varName cost] BECAUSE WE ARE IN A LOOP! 
      # IGNORING THAT WILL DESTROY YOUR DATA. 
      upvar 1 $varName var 
      set cost $var 
     } 
     dict set graph $v1 $v2 $cost 
    } 
    return $graph 
} 
0

Вы можете использовать [subst $cost]. Обратите внимание: myVar должен быть видимым в области действия процедуры.

Выработать:

proc myProc arcs { 
    global myVar 
    foreach arc $arcs { 
     lassign $arc v1 v2 cost 
     dict set graph $v1 $v2 [subst $cost] 
    } 
    return $graph 
} 

Переменная myVar становится видимым с помощью команды global (если он не является глобальным, upvar может сделать). При вставке значений в словарь значение cost передается через subst для выполнения замены переменных из $myVar(index).

можно упростить, что это:

proc myProc arcs { 
    global myVar 
    foreach arc $arcs { 
     dict set graph {*}[subst $arc] 
    } 
    return $graph 
} 

Хотя этот код менее ясна.

Документация: dict, foreach, global, lassign, proc, return, subst

+0

@Ivy - это массив 'myVar', видимый в' proc', как описано Петром? – Jerry

+0

Дорогой Питер.Спасибо за ваш ответ. – Ivy

0

При использовании скобок, замена не производится и используется буквальное значение. Я хотел бы изменить инициализацию использовать список:

set arcs [list \ 
    [list a b $myVar(0)] \ 
    [list b a $myVar(1)] \ 
    [list b c $myVar(2)] \ 
    [list c f $myVar(3)] \ 
    [list b d $myVar(4)] \ 
] 
+0

Дорогой Brad.Thank за ваш ответ. – Ivy

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