2016-08-03 33 views
0

Ich habe ein Problem mit TCL-Skript. in folgendem Code habe ich eine Liste:Abrufen des numerischen Variablenwerts einer Liste in TCL

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

in $ myVar ($ i) einen numerischen Wert gespeichert. und ich habe eine Funktion wie folgt aus:

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

I Funktion genannt:

myProc $arcs 

aber in der Funktion, ich kann `t Abrufen der Wert in $ ab ($ i) gespeicherten numerischen und nur Name der Variablen, die in den $ -Kosten gespeichert sind. wie dieses:

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

Bitte sagen Sie mir, wie ich die Werte der Variablen übergeben kann, um zu funktionieren. wie dieses:

Ich bin neu in tcl und ich kann das Problem nicht lösen. Ich werde wirklich für Ihre Hilfe schätzen.

Antwort

0

Das Problem ist zweifach. Erstens enthält die Eingabeliste nicht den Wert der Variablen, sondern eine Literalfolge, und zweitens ist der Kontext, in dem Sie den Wert benötigen, nicht der Kontext, in dem der Wert bekannt ist. Um dies zu beheben, müssen wir erkennen, wann der Fix angewendet werden soll (regexp ist mein bevorzugter Ansatz) und in diesem Fall upvar 1 verwenden, um die fragliche Variable in einen temporären Bereich mit einem schönen Namen zu bringen, so dass wir die Kosten durch ersetzen können Wert.

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

Sie könnten [subst $cost] verwenden. Beachten Sie, dass myVar im Anwendungsbereich der Prozedur sichtbar sein muss.

Um dies näher auszuführen:

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

Die Variable myVar wird durch den Befehl global sichtbar gemacht (wenn es nicht global ist, upvar tun könnte). Wenn Werte in das Dictionary eingefügt werden, wird der Wert cost über subst übergeben, um die Variablensubstitution von $myVar(index) auszuführen.

Es ist möglich, dass dies zu vereinfachen:

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

Obwohl dieser Code ist weniger klar.

Dokumentation: dict, foreach, global, lassign, proc, return, subst

+0

@Ivy ist das Array 'myVar' sichtbar im' proc' wie Peter umriss? – Jerry

+0

Lieber Peter.Danke für deine Antwort. – Ivy

0

Wenn Sie Klammern verwenden, keine Substitution durchgeführt wird und die wörtliche Wert verwendet wird. Ich würde die Initialisierung ändern, um eine Liste zu verwenden:

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

Lieber Brad. Danke für Ihre Antwort. – Ivy